【BZOJ3522&BZOJ4543】Hotel加强版(长链剖分,树形DP)
题意:求一颗树上三点距离两两相等的三元组对数
n<=1e5
思路:From https://blog.bill.moe/bzoj4543-hotel/
f[i][j]表示以i为根的子树中距离i为j的点的个数
g[i][j]表示以i为根的子树中两点距离他们的lca为d,lca距离i为d-j的两点对数
g[i][j]找到一个子树外的f[i][j]就对答案有贡献
朴素的方程为:设v为u的一个儿子
ans+=f[u][j]*g[v][j+1]+g[u][j]*f[y][j-1]
g[u][j+1]+=f[u][j+1]*f[v][j]
g[u][j-1]+=g[v][j]
f[u][j+1]+=f[v][j]
显然f[i][j]只和深度有关,且f[u]的[1,len[u]]这一段是所有f[v]的[0,len[u]-1]右移一位之和
为了防止同一个子树中的信息算多了,先算ans部分再执行后面三步更新
指针的写法我完全是抄的
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned int uint;
- typedef unsigned long long ull;
- typedef pair<int,int> PII;
- typedef pair<ll,ll> Pll;
- typedef vector<int> VI;
- typedef vector<PII> VII;
- typedef pair<ll,int>P;
- #define N 100010
- #define M 200010
- #define fi first
- #define se second
- #define MP make_pair
- #define pi acos(-1)
- #define mem(a,b) memset(a,b,sizeof(a))
- #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
- #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
- #define lowbit(x) x&(-x)
- #define Rand (rand()*(1<<16)+rand())
- #define id(x) ((x)<=B?(x):m-n/(x)+1)
- #define ls p<<1
- #define rs p<<1|1
- const ll MOD=1e9+,inv2=(MOD+)/;
- double eps=1e-;
- int INF=<<;
- ll inf=5e13;
- int dx[]={-,,,};
- int dy[]={,,-,};
- int head[M],vet[M],nxt[M],tot;
- int len[N],son[N];
- ll tmp[N*],*f[N],*g[N],*now=tmp,ans;
- int read()
- {
- int v=,f=;
- char c=getchar();
- while(c<||<c) {if(c=='-') f=-; c=getchar();}
- while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
- return v*f;
- }
- void add(int a,int b)
- {
- nxt[++tot]=head[a];
- vet[tot]=b;
- head[a]=tot;
- }
- void dfs(int u,int fa,int d)
- {
- len[u]=;
- int e=head[u];
- while(e)
- {
- int v=vet[e];
- if(v!=fa)
- {
- dfs(v,u,d+);
- if(len[v]>len[son[u]])
- {
- son[u]=v;
- len[u]=len[v]+;
- }
- }
- e=nxt[e];
- }
- }
- void solve(int u,int fa)
- {
- if(son[u])
- {
- f[son[u]]=f[u]+;
- g[son[u]]=g[u]-;
- solve(son[u],u);
- }
- f[u][]=;
- ans+=g[u][];
- int e=head[u];
- while(e)
- {
- int v=vet[e];
- if(v!=fa&&v!=son[u])
- {
- f[v]=now;
- now+=(len[v]<<)+;
- g[v]=now;
- now+=(len[v]<<)+;
- solve(v,u);
- rep(j,,len[v])
- {
- if(j) ans+=f[u][j-]*g[v][j];
- ans+=g[u][j+]*f[v][j];
- }
- rep(j,,len[v])
- {
- g[u][j+]+=f[u][j+]*f[v][j];
- if(j) g[u][j-]+=g[v][j];
- f[u][j+]+=f[v][j];
- }
- }
- e=nxt[e];
- }
- }
- int main()
- {
- int n=read();
- tot=;
- rep(i,,n-)
- {
- int x=read(),y=read();
- add(x,y);
- add(y,x);
- }
- len[]=-;
- dfs(,,);
- ans=;
- f[]=now,now+=(len[]<<)+,g[]=now,now+=(len[]<<)+;
- solve(,);
- printf("%lld\n",ans);
- return ;
- }
【BZOJ3522&BZOJ4543】Hotel加强版(长链剖分,树形DP)的更多相关文章
- bzoj4543 [POI2014]Hotel加强版 长链剖分+树形DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. ...
- BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...
- BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)
题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...
- BZOJ3522&4543 [POI2014]Hotel加强版 长链剖分
上上周见fc爷用长链剖分秒题 于是偷偷学一学 3522的数据范围很小 可以暴力枚举每个点作为根节点来dp 复杂度$O(n^2)$ 考虑令$f[x][j]$表示以$x$为根的子树内距离$x$为$j$的点 ...
- 【BZOJ4543】[POI2014]Hotel加强版 长链剖分+DP
[BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 ...
- 【CF1009F】Dominant Indices(长链剖分优化DP)
点此看题面 大致题意: 设\(d(x,y)\)表示\(x\)子树内到\(x\)距离为\(y\)的点的个数,对于每个\(x\),求满足\(d(x,y)\)最大的最小的\(y\). 暴力\(DP\) 首先 ...
- CF1009F Dominant Indices——长链剖分优化DP
原题链接 \(EDU\)出一道长链剖分优化\(dp\)裸题? 简化版题意 问你每个点的子树中与它距离为多少的点的数量最多,如果有多解,最小化距离 思路 方法1. 用\(dsu\ on\ tree\)做 ...
- 长链剖分优化dp三例题
首先,重链剖分我们有所认识,在dsu on tree和数据结构维护链时我们都用过他的性质. 在这里,我们要介绍一种新的剖分方式,我们求出这个点到子树中的最长链长,这个链长最终从哪个儿子更新而来,那个儿 ...
- 2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)
传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 ...
- bzoj 3522 / 4543 [POI 2014] Hotel - 动态规划 - 长链剖分
题目传送门 bzoj 3522 需要root权限的传送点 bzoj 4543 快速的传送点 慢速的传送点 题目大意 给定一棵树,问有多少个无序三元组$(x, y, z)$使得这三个不同点在树上两两距离 ...
随机推荐
- leetcode 141. 环形链表(C++)
给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: 输入: ...
- HTML 解析类库HtmlAgilityPack
1. HtmlAgilityPack简介 网站中首先遇到的问题是爬虫和解析HTML的问题,一般情况在获取页面少量信息的情况下,我们可以使用正则来精确匹配目标.不过本身正则表达式就比较复杂,同时正则表达 ...
- poj2236Wireless Network
Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have ...
- MySQL replace into 与insert into
https://blog.csdn.net/helloxiaozhe/article/details/77427266 使用replace带来的问题 1.Replace into 操作在唯一键重复情况 ...
- C#的一般处理程序中Cookie的写入、读取、清除
1.写入Cookie值 string userName = context.Request.Form["u_Name"].ToString().Trim(); string pwd ...
- kmp(多次可重叠匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=1686 Oulipo Problem Description The French author Georges ...
- L The Digits String(没有写完,有空补)
链接:https://ac.nowcoder.com/acm/contest/338/L来源:牛客网 Consider digits strings with length n, how many d ...
- git-vi
VI命令可以说是Unix/Linux世界里最常用的编辑文件的命令了,但是它的命令集太多,所以要想精通他,也是一件很不容易的事情,除了专业SA,对于我们开发人员而已只需要掌握一些最最常见的用法应该就可以 ...
- bzoj3097 Hash Killer I
Hash Killer I Time Limit: 5 Sec Memory Limit: 128 MBSec Special Judge Description 这天天气不错,hzhwcmhf神犇给 ...
- ES2015箭头函数与普通函数对比理解
直接返回表达式 var odds = evens.map(v => v + 1); var nums = evens.map((v, i) => v + i); var odds = ev ...