传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j​表示iii子树中离iii距离为jjj的点数,gi,jg_{i,j}gi,j​表示iii子树中所有满足dist(lca(u,v),i)−dist(lca(u,v),i)=jdist(lca(u,v),i)-dist(lca(u,v),i)=jdist(lca(u,v),i)−dist(lca(u,v),i)=j的点对数…
[BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 4 5 Sample Output 5 题解:很神的做法. 用f[x][a]表示x子树中有多少个深度为a的点,g[x][a]表示x子树中有多少到lca距离=d的点对,且lca的深度为d-a.那么容易得到转移方程: f[x][a]+=f[y][a-1]g[x][a]+=g[y][a+1]+f[x][a]*f…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. 我一开始是另一种做法,所以别人说这个题目可以有长链剖分来加速的时候怎么也想不出来. 枚举 \(i\),令点 \(i\) 为根,统计三个人的中心是 \(i\) 的情况.首先三个人一定在不同的子树中,然后分层统计一下就好了. 还有一个种纯 dp 的做法: 令 \(dp[x][i]\) 表示 \(x\)…
题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方案数. 设f[i][j]表示i节点子树中与i距离为j的点的个数. g[i][j]表示i节点子树中有g[i][j]对点满足每对点距离他们lca的距离都是d,他们lca距离i节点为d-j 也就是说现在已经找到两个节点了,需要再在没遍历的i的子树中找到一个距离i为j的点. 那么很容易得到转移方程: ans+=f…
题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\(g[x][i]\)表示\(x\)子树中,满足\(u,v\)到\(LCA(u,v)\)的距离都是\(d\),且到\(x\)的距离为\(d-i\)的点对\((u,v)\)个数.(就是不以\(x\)作为三个点的中心位置,那样就没法算了) 如图 那么就可以由\(g[x][i]\)与另一棵子树的\(f[y][…
上上周见fc爷用长链剖分秒题 于是偷偷学一学 3522的数据范围很小 可以暴力枚举每个点作为根节点来dp 复杂度$O(n^2)$ 考虑令$f[x][j]$表示以$x$为根的子树内距离$x$为$j$的点的个数$g[x][j]$表示以$x$为根的子树内的点对$(a,b)$距他们的$lca$的距离为$d$,$x$距$lca$的距离为$d-j$的点对数 那么转移很明了 对于 $x,y$ 其中$fa[y]=x$ 有 $f[x][i]+=f[y][i-1]$ $g[x][i-1]+=g[y][i]$ $g[…
BZOJ4543 POI2014 Hotel加强版 Description 同OJ3522 数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 4 5 Sample Output 5 #include<bits/stdc++.h> using namespace std; #define LL long long #define N 100010 LL pool[N<<4]; LL* top=pool; LL* get(int…
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们把这棵树长链剖分,每次在所有轻儿子中找深度最大的,去掉距离u小于这个深度的栈里的点,然后去计算u的重儿子 然后去掉距离u小于重儿子深度栈里的点,但是要再把u加进去,再遍历u的其他儿子 最后重新去掉u,计算答案,用直径两端当根都做一遍,取深度较大的那个 统计的话直接在外面开一个数组,弹出弹入的时候判断…
题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 数据范围:n<=100000 分析 参照小蒟蒻yyb的博客. 我们先考虑一个\(O(n^2)\)的dp,也就是原题的做法. 我们考虑一下,三个点两两的距离相同是什么情况, 1.存在一个三个点公共的LCA,所以我们在LCA统计答案即可. 2.存在一个点,使得这个点到另外两个子树中距离它为d的点以及这个点的d次祖先. 所以,设\(f[i][j]\)表示以\(i\)为根的子树中,距离当前点为\(j…
传送门 长链剖分好题. 题意:给一棵带点权的树,可以从根节点到任一叶节点走kkk次,走过的点只能计算一次,问kkk次走过的点点权值和最大值. 思路: 考虑将整棵树带权长链剖分,这样链与链之间是不会重复选择的. 然后每条链都对应一种方案,我们贪心选择前kkk大即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0; char ch=getch…