当前位置:网站首页>CF1527D MEX Tree(mex&树&容斥)
CF1527D MEX Tree(mex&树&容斥)
2022-08-04 14:09:00 【Harris-H】
CF1527D MEX Tree(mex&树&容斥)
考虑简单容斥, m e x i mex_i mexi 等于包含 [ 0 , i − 1 ] [0,i-1] [0,i−1]的所有路径减取包含 [ 0 , i ] [0,i] [0,i]的路径。
记录: a n s i ans_i ansi为包含 [ 0 , i ] [0,i] [0,i]的所有路径。
m e x i = a n s i − 1 − a n s i mex_i=ans_{i-1}-ans_i mexi=ansi−1−ansi
m e x 0 = n ( n − 1 ) 2 − a n s 0 mex_0=\dfrac{n(n-1)}{2}-ans_0 mex0=2n(n−1)−ans0
转化为求 a n s i ans_i ansi
考虑从小到大递推。
当前包含 [ 0 , i − 1 ] [0,i-1] [0,i−1]的最短路径端点为 l , r l,r l,r。
情况1 i i i在 l , r l,r l,r路径上,不用操作。
情况2 i i i为 l l l或 r r r的子树结点,将 l l l或 r r r移动到 i i i上,答案就是两个子树大小的乘积。
情况3 i i i不是 l , r l,r l,r的两个 l c a lca lca,说明无解,直接break,后面的 i i i都无解。
注意当 l = 1 l=1 l=1或 r = 1 r=1 r=1 要减取对方的子树大小,再乘积。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
#include<bits/stdc++.h>
using namespace std;
#define ri register int
typedef long long ll;
const int maxn=2e5+10;
struct node{
int to,nxt;
}e[maxn<<1];
int hd[maxn],len;
inline void addedge(int fr,int to){
e[++len]={
to,hd[fr]};
hd[fr]=len;
}
int dep[maxn],fa[maxn],n,son[maxn],t,top[maxn];
ll siz[maxn];
void dfs1(int p,int f){
dep[p]=dep[f]+1;
fa[p]=f;
siz[p]=1;
for(ri i=hd[p];i;i=e[i].nxt)
if(e[i].to!=f){
dfs1(e[i].to,p);
siz[p]+=siz[e[i].to];
if(siz[e[i].to]>siz[son[p]])son[p]=e[i].to;
}
}
void dfs2(int p,int k){
top[p]=k;
if(son[p]){
dfs2(son[p],k);
for(ri i=hd[p];i;i=e[i].nxt)
if(!top[e[i].to])
dfs2(e[i].to,e[i].to);
}
}
inline int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
return dep[x]<dep[y]?x:y;
}
ll ans[maxn];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
len=0;
memset(hd,0,sizeof hd);
memset(son,0,sizeof son);
memset(top,0,sizeof top);
for(ri i=1,x,y;i<n;++i){
scanf("%d%d",&x,&y),++x,++y;
addedge(x,y),addedge(y,x);
}
dfs1(1,0);
dfs2(1,1);
memset(ans,0,sizeof ans);
ll sum=1;
for(ri i=hd[1];i;i=e[i].nxt)ans[1]+=siz[e[i].to]*sum,sum+=siz[e[i].to];
printf("%lld",1ll*n*(n-1)/2-ans[1]);
ri l=1,r=1,sl,sr;
for(ri i=2;i<=n;++i){
ri a=lca(i,l),b=lca(i,r);
if(a==l&&b==1){
if(l==1){
sl=siz[i];
for(ri j=i;fa[j]>1;j=fa[j],sl=siz[j]);
}
l=i;
}
else if(b==r&&a==1){
if(r==1){
sr=siz[i];
for(ri j=i;fa[j]>1;j=fa[j],sr=siz[j]);
}
r=i;
}
else if(a!=i&&b!=i)break;
if(l==1)ans[i]=siz[r]*(n-sr);
else if(r==1)ans[i]=siz[l]*(n-sl);
else ans[i]=siz[l]*siz[r];
}
for(ri i=2;i<=n+1;++i)printf(" %lld",ans[i-1]-ans[i]);
printf("\n");
}
return 0;
}
边栏推荐
猜你喜欢

职场漫谈:为什么越是内卷的行业越有人争着抢着往里冲?好奇怪的说...

第六届未来网络发展大会,即将开幕!

"C pitfalls and pitfalls" reading summary

"Social Enterprises Conducting Civilian Personnel Training Specifications" group standard on the shelves of Xinhua Bookstore

CCF GLCC officially opened | Kyushu Cloud open source experts bring generous bonuses to help universities promote open source

Week 7 Latent Variable Models and Expectation Maximization

【毕设选题推荐】机器人工程专业毕设选题推荐

七夕邂逅爱,那人一定在

Interviewer: How to view files containing abc string in /etc directory?

智能电视可以打开小程序应用,再也不用头痛内存了
随机推荐
化繁为简,聊一聊复制状态机系统架构抽象
Problem solving-->Online OJ (18)
AVR学习笔记之熔丝位
如何查找endnote文献中pdf文件的位置
Kyushu Cloud attended the Navigator Online Forum to discuss the current status, challenges and future of 5G MEC edge computing
浙江大学团队使用基于知识图谱的新方法,从空间分辨转录组数据中推断细胞间通信状况
如何在ubuntu环境下安装postgresql并配置远程访问
Button control switch 4017 digital circuit chip
idea removes spark logs
九州云出席领航者线上论坛,共话5G MEC边缘计算现状、挑战和未来
考研上岸又转行软件测试,从5k到13k完美逆袭,杭州校区小哥哥拒绝平庸终圆梦!
如何通过使用“缓存”相关技术,解决“高并发”的业务场景案例?
centos7安装mysql急速版
Map常见的遍历方式-keySet 和 entrySet
并发程序的隐藏杀手——假共享(False Sharing)
k8s上安装mysql
SMART S7-200PLC串行自由口通讯(耐压测试仪)
AutoCAD DWG,DXF文件导出高清图片、PDF
物联网应用发展趋势
ACL 2022 | 社会科学理论驱动的言论建模