http://www.lydsy.com/JudgeOnline/upload/201712/prob12.pdf dp[len][0/1] 表示节点表示区间长度为len,节点选/不选的 最大匹配 sum[len][0/1] 表示对应dp[len][0/1]的方案数 这里选节点即选节点与其父节点的边 设区间长度为len,左子区间长度为L,右子区间长度为R 这个节点选,那么左右子节点都不能选 dp[len][1]=1+dp[L][0]+dp[R][0] sum[len][1]=sum[L][0]*…
https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的出现次数就是子树中叶子节点的个数 所以只有叶子节点 即 |Right|=1的状态 代表的子串 出现了1次 我们计算以每一个位置为子串右端点时,它对一些位置的贡献 枚举|Right|=1的状态s 令end=Right(s) 那么以end为子串右端点,长度在[1,Max(parent(s))]的子串至少…
https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆的炸弹连单向边 tarjan所点后拓扑排序 在拓扑图上倒着统计答案 可以得到一个炸弹能引爆的编号最小mi和最大的炸弹mx,mx-mi+1就是先引爆这个炸弹一共能引爆的炸弹数 优化: 一个炸弹一定是向一段区间连边 所以用线段树优化,这样向一个区间连边就变成了向一个点连边 注意存边的空间一定要开的足够大…
http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+1 操作3:查询线段树区间最大值 1A,嘎嘎嘎 #include<cmath> #include<cstdio> #include<iostream> using namespace std; #define max(x,y) ((x)>(y) ? (x) : (y)…
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j 位置的数是区间[i,j]的最大值和次大值 提供p2的攻击力:i,j位置的数有一个是区间[i,j]的最大值,另一个不是次大值 记录L[i].R[i] 分别表示i左右第一个大于k[i]的位置 p1的贡献: 1.点对(L[i],R[i])    2.点对(i,i+1) p2的贡献: 1.点对(L[i],…
http://www.lydsy.com/JudgeOnline/problem.php?id=3779 有一棵树,初始每个节点有不同的颜色 操作1:根节点到x的路径上的点 染上一种没有出现过的颜色 操作2:操作1后把x换成根 操作3:定义点x的点权为x到根节点路径上不同颜色的数量,查询x的子树点权和 LCT+线段树+dfs序 dfs一遍得到每个点的dfs序, 以及每个点子树的dfs序范围,记点x的子树dfs序范围为 [Lx,Rx] 线段树以dfs序为顺序维护 操作1就是access, 一条Pr…
http://www.lydsy.com/JudgeOnline/problem.php?id=4869 欧拉降幂+线段树,每个数最多降log次,模数就会降为1 #include<cmath> #include<cstdio> #include<iostream> using namespace std; #define N 50001 int n,m,p,c; int a[N]; ]; ]; ],phi[]; int ans; bool flag; void read…
http://www.lydsy.com/JudgeOnline/problem.php?id=1095 点分树+堆 请去看 http://www.cnblogs.com/TheRoadToTheGold/p/8463436.html 线段树维护括号序列 对树进行dfs,入栈时加一个左括号,出栈时加一个右括号,那么书上两点间的距离=括号序列两点间不匹配括号数 例: 树1--2--3,2为根 括号序列为 (2(3)(1)) 2和1的距离 为 ()( = 1, 3和1的距离为 )( =2 具体怎么维…
http://www.lydsy.com/JudgeOnline/problem.php?id=3672 法一:线段树维护可持久化单调队列维护凸包 斜率优化DP 设dp[i] 表示i号点到根节点的最少花费 dis[i] 表示 点i到根节点的距离 dp[i]= min { (dis[i]-dis[j])* P[i] + Q[i] + dp[j] }   j是i的祖先且dis[i]-dis[j]<=L[i] 即 dp[i]+dis[j]*P[i]=dp[j]+dis[i]*P[i]+Q[i] 斜率优…
http://www.lydsy.com/JudgeOnline/problem.php?id=3730 点分树内对每个节点动态维护2颗线段树 线段树以距离为下标,城市的价值为权值 对于节点x的两棵线段树: 一棵维护 点分树中,x的子树 的贡献 一棵维护 点分树中,x对x的父节点的贡献 查询和修改时,暴力往上爬点分树 点分树保证了最多往上爬log次 查询x k时,先加上点分树内,x的子树中距离<=k的权值和, 再爬到x的父节点f,若x和f的距离为d,则加上f的子树中距离<=k-d的权值和,还要…