[UOJ618]【JOISC2021】聚会 2
#618. 【JOISC2021】聚会 2
就是相当于选中的点在整棵树上的重心
首先,当\(i\)为奇数时,答案为\(1\)
当\(i\)为偶数时,可以将选中的点分为两个子树,分别记其根节点为\(x\)和\(y\)
那么可以发现,所以合法的\(x\)和\(y\)构成一个连通块,那么当前答案就是连通块的直径,且随着\(i\)的增大,连通块逐渐减小
那么点\(x\)在\(i=\min(n-sz[son[x]],sz[x])\)后退出连通块
这就意味着对于当前直径\((x,y)\),\(y\)一定在\(x\)的\(sz\)最大的那棵子树里,\(x\)也一定在\(y\)的\(sz\)最大的那棵子树里
若\(y\)不在\(x\)的\(sz\)最大的那棵子树\(v\)中,那么设\(y\)在\(x\)的\(u\)儿子所代表的子树中,则因为\(y\)所代表的选中的点的个数为\(\frac i2\),所以\(u\)的\(sz\)一定\(\geq \frac i2\),那么\(sz_v\geq sz_u\geq \frac i2\),那么\(x\)就可以向\(v\)的方向移动一个,这样可以保证\(v\)所代表的选中的点一定有\(\frac i2\)个
那么\(x\)久可以一直向后移动知道\(y\)在\(x\)的\(u\)儿子中且\(u\)是\(x\)的\(sz\)最大的那个儿子
#include<bits/stdc++.h>
#define pb push_back
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int N=2e5+5;
int n,q;
int head[N],cnt=1,sz[N];
struct node{
int nxt,v;
}tree[N<<1];
void add(int u,int v){
tree[++cnt]={head[u],v},head[u]=cnt;
tree[++cnt]={head[v],u},head[v]=cnt;
}
vector<int> pos[N];
int dfn[N],to[N<<1],tot,depth[N],st[N<<1][30];
void dfs(int u,int fa){
to[dfn[u]=++tot]=u,st[tot][0]=tot,depth[u]=depth[fa]+1,sz[u]=1;
int minn=n+5;
for(int i=head[u],v;i;i=tree[i].nxt){
if((v=tree[i].v)==fa) continue;
dfs(v,u),sz[u]+=sz[v],minn=min(minn,n-sz[v]),to[++tot]=u,st[tot][0]=dfn[u];
}
minn=min(minn,sz[u]),pos[minn].pb(u);
}
int lca(int u,int v){
u=dfn[u],v=dfn[v];
if(u>v) u^=v^=u^=v;
int k=log2(v-u+1);
return to[min(st[u][k],st[v-(1<<k)+1][k])];
}
int dis(int u,int v){
if(!u||!v) return -1;
return depth[u]+depth[v]-(depth[lca(u,v)]<<1);
}
struct use{
int u,v,len;
use(){}
use(int _u,int _v):u(_u),v(_v){ len=dis(u,v); }
}tr[N<<2];
use max(use a,use b){
return a.len>b.len?a:b;
}
void update(int rt){
tr[rt]=max(max(tr[lson],tr[rson]),max(max(use(tr[lson].u,tr[rson].v),use(tr[lson].u,tr[rson].u)),max(use(tr[lson].v,tr[rson].u),use(tr[lson].v,tr[rson].v))));
}
void Init(int l,int r,int rt){
if(l==r){
tr[rt]=use(l,r);
return;
}
int mid=l+r>>1;
Init(l,mid,lson),Init(mid+1,r,rson);
update(rt);
}
void modify(int l,int r,int rt,int p){
if(l==r){
tr[rt]=use(0,0);
return ;
}
int mid=l+r>>1;
if(p<=mid) modify(l,mid,lson,p);
else modify(mid+1,r,rson,p);
update(rt);
}
int main(){
scanf("%d",&n);
for(int i=1,u,v;i<n;++i) scanf("%d%d",&u,&v),add(u,v);
dfs(1,0),q=log2(tot);
for(int j=1;j<=q;++j) for(int i=1;i+(1<<j)-1<=tot;++i) st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);
lca(2,4);
Init(1,n,1);
for(int i=1;i<=n;++i){
if(i&1) puts("1");
else{
printf("%d\n",max(1,tr[1].len+1));
for(auto u:pos[i>>1]) modify(1,n,1,u);
}
}
return 0;
}
[UOJ618]【JOISC2021】聚会 2的更多相关文章
- BSD和云 – 不可错过的BSD聚会
自2012年开始,微软云计算与企业事业部和Citrix思杰,NetApp达成合作,共同开发出第一版针对Hyper-V虚拟设备驱动以及相关的用户态程序,并将此称之为集成服务 (Integration S ...
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2259 Solved: 1023[Submit] ...
- bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)
题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...
- DHV 平常语言对话 一次聚会离场
一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...
- BZOJ3170: [Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 531 Solved: 249[Submit][Statu ...
- bzoj1832: [AHOI2008]聚会
写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- tyvj1161聚会的名单(trie树)
背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description 明天就是candy的生日.晚上,c ...
- BZOJ 1037 [ZJOI2008]生日聚会Party
1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1583 Solved: 936[Submit][ ...
- BZOJ 1037: [ZJOI2008]生日聚会Party( dp )
dp(i, j, a, b)表示选了i个男生, j个女生, 后缀中男生比女生多a(最多), 女生比男生多b(最多). dp(i+1, j, a+1, max(0, b-1)) += dp(i, j, ...
随机推荐
- Open diary(每天更新)
.col-md-8 img { display: none } .comment img { display: unset } 这是一个open diary,就是公开日记. 为什么标题用英文呢?因为觉 ...
- [源码系列:手写spring] IOC第九节:应用上下文ApplicationContext
内容介绍 在Spring中应用上下文ApplicationContext是相较于BeanFacotry更为先进的IOC容器,BeanFacotry是Spring实现IOC最基础最核心的接口,使得Spr ...
- java学习-6-核心类:字符串StringJoiner 和数组一起玩
public class Main { public static void main(String[] args) { String[] names = {"Bob", &quo ...
- datasnap的回调广播
感觉中的datasnap千孔百疮,到xe10已经具备冲击成千上万用户并发的能力了.应该放心用于项目实战了.补课研究10.1 datasnap开发手册. 用到的方法: (1)TDBXCallback机制 ...
- MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
MySQL 中 count(*).count(1) 和 count(字段名) 的区别 在 MySQL 中,COUNT() 函数用于统计记录数.虽然 COUNT(*).COUNT(1) 和 COUNT( ...
- MCP Server Java 开发框架的体验比较(spring ai mcp 和 solon ai mcp)
目前已知的两个 mcp-server java 应用开发框架(ID类的,封装后体验都比较简洁): spring-ai-mcp,支持 java17 或以上 solon-ai-mcp,支持 java8 或 ...
- js录制系统/麦克风声音(基于electron)
最近想用electron写一个和音视频相关的软件,尽管在写之前都想好了要用哪些技术,但依然写得很艰难,今天对相关知识的个人理解做个记录和整理. 时隔半年,最近发现网上有大神造好的轮子,而且功能强大:h ...
- K8s Pod 控制器介绍及应用示例
Kubernetes 官方文档:Pod 控制器 Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kuber ...
- Spring基于注解的AOP事务控制
Spring基于注解的AOP事务控制 源码 代码测试 pom.xml <?xml version="1.0" encoding="UTF-8"?> ...
- 【SQL周周练】给你无酸纸、变色油墨,你能伪造多少美金?
大家好,我是"蒋点数分",多年以来一直从事数据分析工作.从今天开始,与大家持续分享关于数据分析的学习内容. 本文是第 2 篇,也是[SQL 周周练]系列的第 2 篇.该系列是挑选或 ...