摘要:
#include<bits/stdc++.h> #define getsize(p) (p?p->sz:0) using namespace std; typedef long long ll; const int N=2e5+10; struct node{ int l,r; int sz; no 阅读全文
摘要:
本题最朴素的想法就是对于每个操作,都把他存起来之后查询的时候枚举一下 虽然这是超时的,但是有一个地方可以借鉴一下,那就是题目中的递推式我们在修改操作的时候,是通过经典的方法也就是w-depth[x]-depth[y]+2*depth[lca(x,y)]这个式子 我们猜想对于这种题,查询的时候不能线性 阅读全文
摘要:
套路题,经典dp枚举当前在哪个节点 #include<bits/stdc++.h> #define rep(i,x,n) for(int i=x;i<=n;i++) using namespace std; typedef long long ll; typedef pair<int,ll> pll 阅读全文
摘要:
这题如果普通数位dp,状态不好表示,但是我们发现,一旦当dp过程中,脱离了被最高项束缚的状态后,后面的数字就可以随便填 因此我们直接用组合数dp计算,首先维护前面出现的数字的个数,之后枚举答案d出现的合法状态的次数 设计dp[][],表示前i位,不包括d,在剩余的个数中已经存了j的答案。因此我们可以 阅读全文
摘要:
本题观察数据量非常小,并且求的是多串匹配,因此可以考虑使用ac自动机 设计dp状态为f[][],表示c中前i个字符匹配到第j个节点所能达到的最大值。 首先我们知道,两个匹配串在结束位置的点分别是+-1,而所有前缀能包含这两个字符串的,也应该设为对应的数值,对fail树进行修改进行。 dp的时候,枚举 阅读全文
摘要:
类似没有上司的舞会,找到环上一点,将环断开,强制是否选择root,做树形dp #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+1e5; int h[N],ne[N*2],e[N*2] 阅读全文
摘要:
本题是基环树模板题,但是有一点要注意,特判两元环是必要的 因为两元环中,我们要选权值大的两条边组成的直径,而多元环则不用在意,因为每两个点之间只有一条边 #include<bits/stdc++.h> using namespace std; typedef long long ll; const 阅读全文
摘要:
本题如果删除l-r,那么l-r+1...这些也都是满足的,因此具有单调性。 所以我们考虑枚举l,r,对于判断,维护四个数组 分别为l[],当前数出现的最早时间 r[],当前数出现的最晚时间 ll[],1-i出现的最早时间 rr[],i-n出现的最晚时间 对于满足的状态要分三种情况讨论 #includ 阅读全文
摘要:
类比2019南昌区域赛c题,发现也是个二维数位dp,我们发现差值不可能超过+-1000,并且位数一共100位,因此可以列出状态方程 这题还需要考虑a<b,因此多枚举一位表示当前是否已经小于b #include<bits/stdc++.h> using namespace std; typedef l 阅读全文
摘要:
学习完lyndon分解后,我们发现这个分解可以分割字符串并且分割成a[i]>=a[i+1]且每个字符串都是自己的最小后缀 因此在分解的过程中 当遇到s[j]==s[k],这说明前面都是循环的字符串,那么答案就是上一个同样位置的答案后移一个循环节长度 如果s[j]<s[k],这说明马上整串都变成一个l 阅读全文