
树链剖分
stargazer.
夜を穿つの
展开
-
【LOJ #6073】「2017 山东一轮集训 Day5」距离(主席树 / 树链剖分)
传送门首先若p[i]=ip[i]=ip[i]=i时且离线时可以直接用LNOI2014]Lca的做法在线的话可以用主席树对每个点维护到根上的所有ppp到根的路径+1+1+1修改后的dfsdfsdfs序然后差分一下答案即可如果标记永久化时空常数都会小很多#include<bits/stdc++.h>using namespace std;#define cs const#d...原创 2020-02-18 19:59:07 · 262 阅读 · 0 评论 -
【Codeforces 1010F】Tree(链分治+分治NTT)
传送门瞎写写竟然把zxyoizxyoizxyoi的CF rk1CF\ rk1CF rk1给超了(雾)开始还读错题了(我觉得是题面自己写的锅要求的是不小于两个儿子的权值和可以把权值变为自己的减去两个儿子的显然这样不会改变方案数而且一定权值和等于xxx考虑这时候对于一个kkk个点的树分配权值的方案数就是(x+k−1k−1){x+k-1\choose k-1}(k−1...原创 2020-01-04 11:35:39 · 320 阅读 · 2 评论 -
【UOJ #268】【清华集训2016】数据交互(动态DP)
传送门首先一个结论是所有相交的链一定满足其中一个的lcalcalca在另一个的lcalcalca上考虑对于每一条链除了lcalcalca的点加上一个aaa,lcalcalca加一个bbb那么一条路径的权值就是路径所有点的bbb加上lcalcalca处的aaa考虑询问的是全局的答案用一个可删堆存每个点作为lcalcalca的答案那么就是从往下的链中选2个出来先重链剖分再对每一个点维...原创 2019-12-17 18:54:23 · 370 阅读 · 0 评论 -
【BZOJ 2402】陶陶的难题II(分数规划+树链剖分+凸包二分)
传送门题解已经写在标题上了不过复杂度O(nlog4n)O(nlog^4n)O(nlog4n)能过也是神了#include<bits/stdc++.h>using namespace std;const int RLEN=(1<<20)|5;inline char gc(){ static char ibuf[RLEN],*ib,*ob; (ib==ob)&a...原创 2019-10-19 00:06:29 · 184 阅读 · 0 评论 -
【NOIp训练】—子串查找VII(AC自动机+树链剖分+线段树)
传送门题意:给定nnn个点的树,树上每个节点存有一个字符串sss和权值vvv有mmm次询问每次给定一个字符串SSS和树上一条路径询问每个节点的s在S中出现次数×vs在S中出现次数\times vs在S中出现次数×v之和支持修改点的权值n,m≤2e5,∑∣S∣,∣s∣≤4e5n,m\le2e5,\sum|S|,|s|\le 4e5n,m≤2e5,∑∣S∣,∣s∣≤4e5结果数据水的...原创 2019-08-24 14:55:03 · 226 阅读 · 3 评论 -
【NOIp2019模拟】题解
T1:一个显然的背包dpdpdp枚举最长的长度f[i][j]f[i][j]f[i][j]表示前iii个选了jjj种数的方案主要考场傻逼了转移的时候枚举了某个数选几个实际上只需要看和前面一个是否相同#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;inline char gc...原创 2019-09-09 08:49:29 · 271 阅读 · 0 评论 -
【CSP-S 2019模拟】T1 —看门人(长链剖分+线段树)
传送门签到水题长剖维护一下,每次在链顶把链底向上一个个合并轻儿子用一颗线段树维护单点修改和区间询问即可考试的时候看错题了…以为只找向下一条路径还写了个线段树合并对拍了2h2h2h我是个瓜皮#include<bits/stdc++.h>using namespace std;const int RLEN=1<<22|5;inline char gc()...原创 2019-09-11 21:37:34 · 258 阅读 · 0 评论 -
【UOJ #284】— 快乐游戏鸡(长链剖分+线段树)
传送门可以发现我们大致是要维护一个每个深度的最大值之类的东西考虑离线下来对每个点处理所有子树内的询问设f[i][j]f[i][j]f[i][j]表示点iii子树深度为jjj以内的最大值是多少那么f[i][j]−f[i][j−1]f[i][j]-f[i][j-1]f[i][j]−f[i][j−1]就是深度jjj走的次数那么对于一个询问(s,t)(s,t)(s,t)答案就是∑i=1d=de...原创 2019-09-17 18:16:12 · 512 阅读 · 0 评论 -
【洛谷 P5305】【GXOI/GZOI2019】—旧词(树链剖分)
传送门用类似LcaLcaLca那道题的做法做但这里是depkdep^kdepk把一个点系数设为depk−(dep−1)kdep^k-(dep-1)^kdepk−(dep−1)k即可#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;inline char gc(){ sta...原创 2019-09-20 13:01:45 · 182 阅读 · 0 评论 -
【HDU 5566】—Clarke and room(Ac自动机+树链剖分)
传送门感觉像以前做过的一道题的简化版而且可以离线做这样时空复杂度都会小很多#include<bits/stdc++.h>using namespace std;const int RLEN=1<<20|1;inline char gc(){ static char ibuf[RLEN],*ib,*ob; (ob==ib)&&(o...原创 2019-09-25 17:47:22 · 245 阅读 · 0 评论 -
【BZOJ4712】—洪水(链分治)
传送门每次O(n)O(n)O(n)dp很显然要么所有儿子的,要么自己的ddpddpddp维护轻儿子的答案#include<bits/stdc++.h>using namespace std;#define gc getcharinline int read(){ char ch=gc(); int res=0,f=1; while(!isdigit(ch))f^=c...原创 2019-08-09 21:51:14 · 274 阅读 · 0 评论 -
【BZOJ3626】【LNOI2014】—Lca(树链剖分)
传送门发现一次询问的答案就是把[l,r][l,r][l,r]所有点到根的路径+1+1+1后zzz到根的路径权值和离线差分就完了#include<bits/stdc++.h>using namespace std;#define ll long long#define pb push_backconst int RLEN=1<<20|1;inline ch...原创 2019-06-09 16:12:55 · 290 阅读 · 0 评论 -
【Codeforces1009F】—Dominant Indices(长链剖分)
传送门题意:给你一棵树,对每个点询问子树中节点数目最多的深度长链剖分板子题不多解释#include<bits/stdc++.h>using namespace std;inline int read(){ int res=0,f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar()...原创 2019-03-01 19:17:18 · 388 阅读 · 0 评论 -
【COGS2652】—天文密葬法(分数规划+长链剖分)
COGS传送门(已咕咕)一眼分数规划二分一个midmidmid,找到∑ai−∑bi∗mid\sum{a_i}-\sum{b_i}*mid∑ai−∑bi∗mid最小的路径,如果路径长大于0,下界调高,否则上界调低考虑f[i][j]f[i][j]f[i][j]表示以iii为根,深度为jjj的路径的最小值显然对于一个点只有可能是往下一整条链或者2条链拼起来发现fff第二维只和深度有关,就可...原创 2019-03-12 12:41:12 · 216 阅读 · 1 评论 -
【BZOJ4543】【POI2014】Hotel加强版(长链剖分)
传送门题意:求树上满足三点之间距离两两相等的三元组个数n≤1e5n\le 1e5n≤1e5原题数据是n≤5000n\le5000n≤5000考虑怎么做f[u][i]f[u][i]f[u][i]表示uuu为根,深度为iii的点的个数g[u][i]g[u][i]g[u][i]表示uuu为根,满足2点到lcalcalca的距离减去lcalcalca到uuu的距离为iii,即dep[x]+de...原创 2019-03-30 19:47:52 · 285 阅读 · 0 评论 -
【Codeforce 487E】【UOJ#30】—Tourists(圆方树+树链剖分)
传送门题意:求无向图2点之间简单路径最小值直接对无向图建出圆方树后树链剖分,每个方点维护一下儿子最小值用可删堆维护一下就好了#include<bits/stdc++.h>using namespace std;#define ll long longconst int RLEN=1<<18|1;#define gc getcharinline int r...原创 2019-04-02 11:38:30 · 192 阅读 · 0 评论 -
【BZOJ2125】—最短路(圆方树+树链剖分)
传送门题意:询问仙人掌上2点之间最短路先建出圆方树,每个圆点到方点的距离为到这个环最高点的最短距离每次询问分类讨论一下圆点方点如果是方点的话找到到这个环的那个入点,计算2个入点之间最短距离就可以了#include<bits/stdc++.h>using namespace std;const int RLEN=1<<18|1;#define file fre...原创 2019-04-02 11:44:53 · 218 阅读 · 0 评论 -
【BZOJ4817】【SDOI2017】—树点涂色(LCT+树链剖分+线段树)
传送门考虑到每次都是到根染上一种和原来不同的颜色这个操作和LCTLCTLCT时的accessaccessaccess很像实际询问的也就是到根改变了多少次虚实链考虑一次accessaccessaccess的影响对原来的实儿子也就是多了一次切换子树答案加1就是了对于新的实儿子则少了一个切换子树答案减一树剖维护一下就完了#include<bits/stdc++.h>u...原创 2019-05-25 20:02:05 · 154 阅读 · 0 评论 -
【BZOJ4867】【洛谷P5210】【ZJOI2017】—线段树(括号序列+树链剖分)
BZOJ洛谷LOJ丢人O(nlog2n)O(nlog^2n)O(nlog2n)大常数跑不过BZOJBZOJBZOJ老爷机考虑如果当前询问区间为[l,r][l,r][l,r]我们从l−1l-1l−1和r+1r+1r+1的叶子节点往上走到lca(l−1,r+1)lca(l-1,r+1)lca(l−1,r+1)把l−1l-1l−1往上所有右儿子记下来,r+1r+1r+1所有左儿子记下来那...原创 2019-06-19 09:47:05 · 234 阅读 · 0 评论 -
【BZOJ2434】【NOI2011】—阿狸的打字机(AC自动机+线段树)
传送门考虑一个串AAA在另一个串BBB中出现的次数其实就是BBB串的链上有多少个点的failfailfail直接或间接指向AAA的末指针所以建出failfailfail树后就是AAA的末指针的子树和每次暴力把BBB的所有点设成1查询可以有707070分离线后对于每个BBB记一下要询问哪些就行了复杂度O(nlogn)O(nlogn)O(nlogn)#include<bits/s...原创 2019-06-09 16:08:33 · 118 阅读 · 0 评论 -
【BZOJ4538】【HNOI2016】—网络(树链剖分+可删堆)
传送门题意:给定一棵树,支持添加一条路径,删除一条路径,询问不经过某一点的路径中的最大值考虑到删除和询问最大值普通线段树很难维护考虑把线段树上每个节点设成一个可删堆就可以方便的维护删除和最大值了由于询问“不经过某一点”的最大值,我们修改就对于整棵树关于这条路径的补集修改由于路径的区间是O(logn)O(logn)O(logn)个,那么补集也是有O(logn)O(logn)O(logn)...原创 2019-02-21 12:38:48 · 211 阅读 · 0 评论