随笔分类 -  数据结构

摘要:n<=200000个点,从i会跳到$i+num_i$,保证$num_i>0$,m<=100000个两种操作:一、修改一个$num$;二、问从$i$开始跳多少步跳出这个序列。 大概是LCT的模板题了。 记住access操作,不停的旋完把右子树腾给儿子。其他可以自行推。 1 #include<strin 阅读全文
posted @ 2018-01-15 19:47 Blue233333 阅读(168) 评论(0) 推荐(0)
摘要:n<=1e6的树问所有路径的极差之和。 被遗忘的套路。。。以后绝对不会再忘了QAQ 只要算最大值之和即可,最小值同理。数字从大到小排序(反正都是要排序的,如果从大到小不行等会反过来试试),然后逐个考虑贡献,这样的话考虑完一个点就得把这个点周围所有的边断掉表示经过这些边的路径(即经过当前点的路径)不再 阅读全文
posted @ 2018-01-15 08:24 Blue233333 阅读(336) 评论(0) 推荐(0)
摘要:n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改、查询,区间修改、查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两棵树u,v时,把v放到u树根节点的最后,使其dfs序最后,最后扫一次把每棵树dfs一下搞出这个序列,然后线段树操 阅读全文
posted @ 2018-01-11 19:54 Blue233333 阅读(207) 评论(0) 推荐(0)
摘要:给n<=100000的树,每个点有权值和代价,有m<=1e9的容量,问:一个点权值*子树内代价总和不超过容量的最大点数的最大值。 其实就是要合并。平衡树、线段树、可并堆挑一个。 可并堆由于没法二分,故“正难取反”,维护最大的,在不够装时弹掉。 1 #include<string.h> 2 #incl 阅读全文
posted @ 2018-01-11 09:53 Blue233333 阅读(183) 评论(0) 推荐(0)
摘要:可并堆模板??又敲了一次,一遍过,很好。 1 #include<string.h> 2 #include<stdlib.h> 3 #include<stdio.h> 4 #include<math.h> 5 //#include<assert.h> 6 #include<algorithm> 7 / 阅读全文
posted @ 2018-01-11 08:55 Blue233333 阅读(166) 评论(0) 推荐(0)
摘要:n<=1e6个数,把他们修改成递增序列需把每个数增加或减少的总量最小是多少? 方法一:可以证明最后修改的每个数一定是原序列中的数!于是$n^2$DP(逃) 方法二:把$A_i$改成$A_i-i$,变论文题:论文 大概证明是这样的:考虑合并两个区间的答案,假如一个区间答案是{u,u,u,……,u},另 阅读全文
posted @ 2018-01-11 08:24 Blue233333 阅读(153) 评论(0) 推荐(0)
摘要:#include #include #include //#include #include //#include using namespace std; int n,m; #define maxn 200011 int root[maxn]; bool die[maxn]; int find(int x) {return root[x]==x?x:(root[x]=find(root[x]... 阅读全文
posted @ 2018-01-10 18:42 Blue233333 阅读(167) 评论(0) 推荐(0)
摘要:平衡树并不是之前没写过,觉得有必要把平衡树变成考场上能敲的东西,也就是说,考一道诸如“维修数列”这样的送分题,要能拿满分。 维修数列。给定一个数列支持以下操作: 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目。第2行包含N个数字,描述初始 阅读全文
posted @ 2018-01-09 19:41 Blue233333 阅读(211) 评论(0) 推荐(0)
摘要:n<=500,n*n的矩阵,m<=60000个询问每次问子矩阵第K小。 方法一:第K小什么的是可以二分的,那就整体二分套二维树状数组吧! 这里有一个细节优化,本来整体二分是logMax的嘛,可以先把数字排个序,就变成logn了。这是没优化的后果(话说3个log确实极卡) 方法二:分块,n*n个数字从 阅读全文
posted @ 2018-01-08 08:39 Blue233333 阅读(183) 评论(0) 推荐(0)
摘要:n<=50000个vector进行m<=50000次操作:1、一区间的vector插入一个数;2、查询一区间中的vector中的所有数的第k大。 方法一:普通线段树套权值线段树!…… 方法二:单个询问是可以二分的,那就整体二分吧。这次是用线段树维护,把所有数字反过来求第k小再反过来就是第k大,注意5 阅读全文
posted @ 2018-01-08 07:36 Blue233333 阅读(179) 评论(0) 推荐(0)
摘要:n<=10000个数有m<=10000个操作,1、询问一个区间的第k小的数;2、单点修改。 带修主席树。 整体二分。 整体二分的必要条件: 1 #include<string.h> 2 #include<stdlib.h> 3 #include<stdio.h> 4 //#include<asser 阅读全文
posted @ 2018-01-07 21:24 Blue233333 阅读(271) 评论(0) 推荐(0)
摘要:给n<=50000个longlong范围内的可正可负的数字问下面式子的最大值: $f(l,r)=(a_l,a_{l+1},...,a_{r-1},a_r)(\sum_{i=l}^{r}a_i-max(a_l,a_{l+1},...,a_{r-1},a_r))$。 注意到括号里那坨区间和-区间最大值在 阅读全文
posted @ 2018-01-05 11:12 Blue233333 阅读(160) 评论(0) 推荐(0)
摘要:一个数表上第i行第j列表示能同时整除i和j的自然数,Q<=2e4个询问,每次问表上1<=x<=n,1<=y<=m区域内所有<=a的数之和。n,m<=1e5,a<=1e9。对2^31取模。 这个a很讨厌就先不理他。首先i行j列的那个数其实是$a_{ij}=\sum_{x|gcd(i,j)} x$,令$ 阅读全文
posted @ 2018-01-02 13:44 Blue233333 阅读(368) 评论(0) 推荐(0)
摘要:n<=500000的数字,问有多少个区间的众数出现次数严格大于区间长度的一半。 这么说来一个区间就一个众数了,所以第一反应是枚举数字,对下标进行处理。然后没有第二反应。很好。 在枚举一个数字的时候,可以把这个数字出现的位置记+1,没出现的位置记-1,实际就是问现在这个数组有多少个区间和>0,就是问对 阅读全文
posted @ 2017-12-28 22:09 Blue233333 阅读(281) 评论(0) 推荐(0)
摘要:n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物;查询熟食中编号最小的并删除之;查询是否有编号为id的食物,如果有查询是否有编号为id的熟食,如果有熟食删除之,否则输出其离煮熟的最小时间;查询编号在[L,R]的熟食有多少。保证操作时间递增。 可以发现:针 阅读全文
posted @ 2017-12-25 07:14 Blue233333 阅读(207) 评论(0) 推荐(0)
摘要:给定n<=200000个操作:单点插入,查最后若干个数的Max,强制在线。 在线个鬼啊至少我空间还是可以先分配的,把序列倒过来,分配好空间,每个查询就是一个前缀Max了。 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 阅读全文
posted @ 2017-12-21 21:55 Blue233333 阅读(149) 评论(0) 推荐(0)
摘要:n<=100000个<=100000的正数,其中有一些0表示这个位置的数字可以是L~R中的一个,L,R是给定常数且1<=L<=R<=100000,问最长上升子序列。 先暴力啊!$f(i,j)$表示前i个数中以j结尾的答案。$f(i,j)=f(i-1,j)$,$f(i,a_i)=max(f(i-1,j 阅读全文
posted @ 2017-12-21 16:45 Blue233333 阅读(232) 评论(0) 推荐(0)
摘要:n<=200000个<=200000的数问所有的f(i,j)的和,表示去掉区间i到j后的剩余的数字中任选两个数的最大gcd。 数论日常不会。。 先试着计算一个数组:Hi表示f(l,r)<=i的(l,r)的数量。这样答案就是i*(H_i - H_i-1)的和。要求删掉某个区间后剩余的区间的最大gcd, 阅读全文
posted @ 2017-12-20 19:21 Blue233333 阅读(478) 评论(0) 推荐(0)
摘要:给一个字符串支持以下操作:区间删除某个特定字符。最后输出字符串。n,m<=200000。 这题我居然不会可以回家了。。 首先,单点删除,选个平衡树比如set。 然后,他给的下标是会随删除操作变化的,需要查“存在于字符串中的第K个是谁”来找左右端点,一个树状数组搞定。 树状数组找出题目给的x,y在初始 阅读全文
posted @ 2017-12-18 21:42 Blue233333 阅读(268) 评论(0) 推荐(0)
摘要:维护一个序列支持以下操作:区间加,区间求最大子段和。n<=50000,m<=50000。 我TM再也不写分块了。。。 先分块,对于块整体加的操作,假设块里面有若干二元组(x,y),表示一个大小x的区间的和为y,那实际就是求kx+y=z的最大值,而y=-kx+z,所以即求经过这些点、斜率不定的直线的最 阅读全文
posted @ 2017-12-18 21:04 Blue233333 阅读(447) 评论(0) 推荐(0)