随笔分类 - ACM_数据结构
摘要:通道思路:每个数建个31位的树,处理好关系即可代码:#include #include #include using namespace std;const int N = 60007;const int BIT = 32;int n, m;int tot, s[N * BIT], a[N * BI...
阅读全文
摘要:题意:给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数思路:整体二分+二维树状数组二分询问的答案mid,将数值小等mid的全部插入二维树状数组然后查询每个矩阵内的元素个数,若数量>K-1则放左边,否则放右边继续向下分治,左边二分l-mid,右边mid-r代码:#include#...
阅读全文
摘要:通道题意:有m个空间站组成一个环形的轨道,每个空间站属于n个国家之一。一次流星雨可以给一段连续的空间站带来同样数量的陨石样本。给出每个国家需要的陨石数量和流星雨的出现情况,问每个国家最快在多少次流星雨前就能收集到需要数量的陨石思路:分别二分算出答案即可代码:#include #include #in...
阅读全文
摘要:通道题意:给你n(1e5)个三元组、然后要你求这n个三元组的LIS。和这样LIS的方案数。一个三元祖a比另一个元祖b大的条件是ax>=bx,ay>=by,az>=bz思路:排序x去掉一维。然后我们要找到 y z。然后对于一个区间上,我们对y排序,但是在排序之前记录下此时的id排序之后,就能得到y的递...
阅读全文
摘要:题意:维护一个W*W的矩阵,每次操作可以增加某格子的权值,或询问某子矩阵的总权值思路:CDQ模板题吧,点和矩形(4个点)都看成点,然后利用矩阵的前缀和可求出代码:#include #include #include #include using namespace std;const int max...
阅读全文
摘要:题意:先给出n个点, 然后有m个操作, (1, x, y) 表示查询离(x, y)最近点的曼哈顿距离, (2, x, y) 表示插入点 (x, y).思路:. 距离点(x, y)最近的点和x的方位有四种, 左下左上右下右上, 然后只考虑一个方位, 另外的改变坐标即可. dis({x, y}, {x'...
阅读全文
摘要:通道思路:dp[i]由dp[i-1]而来,统计小于a[i]的位置k,且dp[k]+1=dp[i]的所有个数即可。代码:#include #include #include using namespace std;typedef long long ll;template inline bool rd...
阅读全文
摘要:通道题意:给出1字母树,询问一字符串是否出现在该树中思路:直接搜索剪枝,有人点分治?写了几发都T了。。有人会了教我?代码:#include #include #include using namespace std;struct Edge { int v, nxt; Edge () { ...
阅读全文
摘要:通道题意:0-9字符串,区间修改,区间询问是否d周期思路:直接暴力线段树,然后HASH修改和查询,卡HASH的话就双HASH。代码:#include#includetypedef long long ll;const int N = 100007;int n, m, k, lens;char s[N...
阅读全文
摘要:通道题意:给n(n #include #include #include using namespace std;int v7[8][8][8][8][8][8][8];int v6[8][8][8][8][8][8];int v5[8][8][8][8][8];int v4[8][8][8][8]...
阅读全文
摘要:通道题意:有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c,如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少思路:先开一颗权值线段树。对于当前结点K,它表示了权值范围为a~b的所有结点的信息。但是有人要...
阅读全文
摘要:通道题意:一个公司获得了一个厂房n(10^5)天的使用权和一笔启动资金C(10^9),准备在n天里租借机器生产来获得收益可以租借的机器有M(10^5)个,每个机器有四个值,D,P,R,G (D= P[j]可以看出是O(n^2)的,显然不行啊令h[j] = f[j] + R[j]- P[j] - G[...
阅读全文
摘要:通道题意:区间K大代码:#include#includeusing namespace std;int n,m,sz,tot;int root[100001],a[100001],ls[8000001],rs[8000001],s[8000001];int num[100001],hash[1000...
阅读全文
摘要:通道题意:区间k大,单点修改思路:裸,复杂度n(lgn)^2代码:#include #include #include #include #include using namespace std;const int N = 60010 * 5;const int M = 100100 * 4;#de...
阅读全文
摘要:通道题意:给出n个数,m组序列,然后每次可以选择一个序列给对应的每个数加定值,及询问该组对应数之和思路:可以知道修改某一组后,肯定对应和其他组有相交部分也要对应修改,每次去修改肯定不现实,然后对于sqrt(n)以内的数可以O(n)修改,其他的只要计算对应的增量即可,然后维护对于大于sqrt(n)的序...
阅读全文
摘要:通道题意:询问[l,r]区间的权和,权定义为sum(k^2*a[i]),k表示a[i]出现的次数思路:区间每增加一个a[i],增量是(2*x+1)*a[i],因为(x+1)^2*a[i] = (x^2 +2*x + 1)*a[i]分块排序即可,块内按r排序代码:#include #include #...
阅读全文
摘要:通道题意:区间[L, R] 之间排序后有多少段连续的数思路:一个一个的向里面添加,只需要判断a[i]-1 和 a[i]+1是否已经添加在内,如果两个都在,则总段数减1,如果两个都不在,总段数加1,其他情况总段数不变代码:分块、#include #include #include #include u...
阅读全文
摘要:通道题意:区间涂色,询问区间内颜色相同的个数思路:将原区间划分乘sqrt(n)个区间,每次暴力查询和跟新两边的区间,中间的区间直接用hash存每种颜色的节点的数量。这里用到了类似线段树的lazy思想,区间成段修改直接打个标记,等到要划分这个区间的时候先把标记传下去,然后更新代码:#include #...
阅读全文
摘要:通道题意:给一个树,树上每个节点都有两个属性:忠诚度和能力,给出若干查询,求每个子树中能力 > 树根能力的点中,忠诚度最高的那个思路:子树dfs序即可,然后忠诚度排个序,取能力值大于u且忠诚度最高的,虽然线段树也可以搞,练练分块。代码:#pragma comment(linker, "/STACK:...
阅读全文
摘要:通道题意:一棵树,每个节点有一个点值(字符),问u子树的深度为k的所有节点组成的字符串是否为回文思路:搜出dfs序及该节点的深度,那么u节点深度为K的那一段肯定在dfs序[l,r]区间内,然后对于回文的处理,要么这段异或和为0,要么lowbit(x)=x代码:#include using names...
阅读全文

浙公网安备 33010602011771号