CF1527D MEX Tree(mex&树&容斥)

考虑简单容斥,meximex_imexi​ 等于包含[0,i−1][0,i-1][0,i−1]的所有路径减取包含[0,i][0,i][0,i]的路径。

记录:ansians_iansi​为包含[0,i][0,i][0,i]的所有路径。

mexi=ansi−1−ansimex_i=ans_{i-1}-ans_imexi​=ansi−1​−ansi​

mex0=n(n−1)2−ans0mex_0=\dfrac{n(n-1)}{2}-ans_0mex0​=2n(n−1)​−ans0​

转化为求ansians_iansi​

考虑从小到大递推。

当前包含[0,i−1][0,i-1][0,i−1]的最短路径端点为l,rl,rl,r。

情况1 iii在l,rl,rl,r路径上,不用操作。

情况2 iii为lll或rrr的子树结点,将lll或rrr移动到iii上,答案就是两个子树大小的乘积。

情况3 iii不是l,rl,rl,r的两个lcalcalca,说明无解,直接break,后面的iii都无解。

注意当l=1l=1l=1或r=1r=1r=1 要减取对方的子树大小,再乘积。

时间复杂度:O(nlogn)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;
}

CF1527D MEX Tree(mex树容斥)相关推荐

  1. Codeforces Round #686 (Div. 3) E. Number of Simple Paths 基环树 + 容斥

    传送门 文章目录 题意: 思路: 题意: 给你一颗基环树,求长度>=1>=1>=1的路径个数. 思路: 先考虑一棵树,他的答案显然是n∗(n−1)2\frac{n*(n-1)}{2} ...

  2. AT4352-[ARC101C] Ribbons on Tree【dp,容斥】

    正题 题目链接: https://www.luogu.com.cn/problem/AT4352 https://atcoder.jp/contests/arc101/tasks/arc101_c 题 ...

  3. ARC101E Ribbons on Tree 树形dp 容斥

    题目链接 题意: 给你一棵nnn个点的树,nnn是偶数,把这些点分成n2\frac{n}{2}2n​个点对,每个点对会把路径上的所有边覆盖,问你每条边至少覆盖一次有多少种配对方式.n<=5000 ...

  4. [bzoj4596][矩阵树][容斥]黑暗前的幻想乡

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 565 Solved: 328 [Submit][Sta ...

  5. [Codeforces235D]Graph Game——概率与期望+基环树+容斥

    题目链接: Codeforces235D 题目大意:给出一棵基环树,并给出如下点分治过程,求点数总遍历次数的期望. 点分治过程: 1.遍历当前联通块内所有点 2.随机选择联通块内一个点删除掉 3.对新 ...

  6. 【POJ - 1741】Tree(树分治,容斥,点分治,模板题)

    题干: Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist ...

  7. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

    题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...

  8. HDU - 4747 Mex(线段树)

    题意: 计算    其中mex即为博弈中出现的mex(未出现的最小非负整数). 分析: 有两种方法,递推有点懵(以后再来补QAQ),就写了线段树 想法是每次求以i为起点的区间的mex值的和,最后累加即 ...

  9. 【UOJ 429】串串划分(Runs)(容斥)+ 有关 Lyndon Tree 及其应用的小小记录

    串串划分 题目链接:UOJ 429 题目大意 给你一个字符串,然后问你有多少个划分,满足相邻的两个串不相等,且每个串都不存在整周期. 思路 Lyndon Tree L y n d o n T r e ...

最新文章

  1. vscode 默认初始化_VSCode设置初始化模板
  2. Kconfig文件结构(图文)简介
  3. Android应用程序之间共享文字和图片(一)
  4. sqlserver2008导出mysql_SQLserver 2008将数据导出到Sql脚本文件的方法
  5. C语言 - strcpy和strncpy的编程实现及总结
  6. net 开发 【要学习】
  7. 专栏丨MySQL 高频面试题解析
  8. 电子表格和oracle,##请问数据库和电子表格之间有什么区别
  9. html列自动变高,HTML_CSS三行三列DIV高度自适应的设置,用脚本控制三行三列div高度自 - phpStudy...
  10. Akka-Cluster(0)- 分布式应用开发的一些想法
  11. ReentrantLock可重入锁的使用
  12. 使用自定义手势处理器-陈鹏
  13. 那些脱颖而出的云计算认证
  14. 纯html5单击箭头切换图片,简单的实现点击箭头图片切换的js代码
  15. Windows 7精简版(2019.04.10)
  16. linux man page
  17. 2010年5月24日--2015年5月24日
  18. 浅谈MYSQL之级联复制(附带实验)
  19. Python-字典学习
  20. unity3D 音频播放

热门文章

  1. 江苏统考计算机英语作文,2017年高考江苏卷英语作文
  2. java实现oracle的months_between函数
  3. 完形填空生成器 1-1 打开文本框与提取文本字符
  4. 用keyboard模块模拟记录键盘操作
  5. Vue 实例实战之 Vue webpack 仿去哪儿网App页面开发(应用中的几个页面简单实现)
  6. 「 周末去哪儿」安卓版免费下载 - 豌豆荚
  7. 来自一位双非本科跌跌撞撞的秋招指南(秋招攻略/经验分享/干货)
  8. html空间进入动画界面,HTML5 / CSS3 Transform / Animation 示例页面
  9. 《云计算核心技术剖析》迷你书连载三 – 云计算的商业模式
  10. JAVA实现MD5带盐加密_MD5加盐加密