P4299 首都
题目
做法
这题是动态维护树的重心,连边后找到两棵树的重心拉一条链(性质:新重心在链上),然后暴力爬
要注意:
1.是找重心的过程中要先把旋转标记放下来,因为\(Splay(x)\),这个操作只把\(x\)到根节点的跟上旋有关标记放下来
而找重心过程中跟整个链有关
2.并查集的时候记得把\(z\)也改变一下,不然会死循环,卡了好久\(emmm\)
My complete code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef int LL;
const LL maxn=200000,inf=0x3f3f3f3f;
inline LL Read(){
LL x(0),f(1);char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
LL n,m,Xor;
LL son[maxn][2],fa[maxn],sta[maxn],f[maxn],isum[maxn],sum[maxn],r[maxn];
inline void Update(LL x){
sum[x]=sum[son[x][0]]+sum[son[x][1]]+isum[x]+1;
}
inline bool Notroot(LL x){
return son[fa[x]][0]==x||son[fa[x]][1]==x;
}
inline void Pushr(LL x){
swap(son[x][0],son[x][1]),r[x]^=1;
}
inline void Pushdown(LL x){
if(r[x]){
if(son[x][0]) Pushr(son[x][0]);
if(son[x][1]) Pushr(son[x][1]);
r[x]=0;
}
}
inline void Rotate(LL x){
LL y(fa[x]),z(fa[y]),lz(son[y][1]==x);
if(Notroot(y)) son[z][son[z][1]==y]=x;fa[x]=z;
son[y][lz]=son[x][lz^1];
if(son[y][lz]) fa[son[y][lz]]=y;
son[x][lz^1]=y; fa[y]=x;
Update(y),Update(x);
}
inline void Splay(LL x){
LL y(x),top(0);sta[++top]=y;
while(Notroot(y)) sta[++top]=y=fa[y];
while(top) Pushdown(sta[top--]);
while(Notroot(x)){
y=fa[x];
if(Notroot(y)){
LL z(fa[y]);
if(((son[y][1]==x)^(son[z][1]==y))==0) Rotate(y);
else Rotate(x);
}Rotate(x);
}
}
inline void Access(LL x){
for(LL y=0;x;y=x,x=fa[x]){
Splay(x),isum[x]+=sum[son[x][1]];
son[x][1]=y;isum[x]-=sum[son[x][1]];
Update(x);
}
}
inline void Makeroot(LL x){
Access(x),Splay(x),Pushr(x);
}
inline void Split(LL x,LL y){
Makeroot(x),Access(y),Splay(y);
}
inline void Link(LL x,LL y){
Makeroot(x),Access(y),Splay(y);
fa[x]=y;
isum[y]+=sum[x];
Update(y);
}
LL Get_fa(LL x){
return f[x]=(f[x]==x?x:Get_fa(f[x]));
}
inline LL Get_w(LL x){
LL ji=sum[x]&1,M=sum[x]>>1,lsum(0),rsum(0),new_w(inf),nowl,nowr;
while(x){
Pushdown(x);
nowl=sum[son[x][0]]+lsum,nowr=sum[son[x][1]]+rsum;
if(nowl<=M&&nowr<=M){
if(ji){
new_w=x;
break;
}else
new_w=min(new_w,x);
}
if(nowl<nowr){
lsum+=sum[son[x][0]]+isum[x]+1;
x=son[x][1];
}else{
rsum+=sum[son[x][1]]+isum[x]+1;
x=son[x][0];
}
}
Splay(new_w);
return new_w;
}
int main(){
n=Read(),m=Read();
for(LL i=1;i<=n;++i)
sum[i]=1,f[i]=i,Xor^=i;
while(m--){
char s[100];
scanf(" %s",s);
if(s[0]=='X') printf("%d\n",Xor);
else if(s[0]=='Q'){
LL x(Read());
printf("%d\n",Get_fa(x));
}else{
LL x(Read()),y(Read());
Link(x,y);
Split(x=Get_fa(x),y=Get_fa(y));
LL z=Get_w(y);
f[x]=f[y]=f[z]=z;
Xor^=x^y^z;
}
}return 0;
}
P4299 首都的更多相关文章
- luogu P4299 首都
题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...
- 洛谷P4299 首都(BZOJ3510)(LCT,树的重心,二分查找)
Update:原来的洛谷U21715已成坑qwq 已经被某位管理员巨佬放进公共题库啦!又可以多一个AC记录啦! 洛谷题目传送门 其实也可以到这里交啦 思路分析 动态维护树的重心 题目中说到国家的首都会 ...
- Luogu P4299 首都 LCT
既然是中文题目,这里便不给题意. 分析: 这个题的做法据说是启发式合并? 但是我不会啊…… 进入正题,LCT是怎样做掉这道题的.记得在前面的一篇<大融合>的题解中,介绍过LCT维护子树信息 ...
- [洛谷P4299] 首都
题目传送门 还是维护子树信息. 但是这里多了一个找重心的操作. 这里有一个关于树重心的结论,据说可以用反证法证明.反正我不会证 就是:新的重心一定在原来两个重心之间的那条树链上. 这样我们逐步缩小搜索 ...
- [总结] LCT学习笔记
\(emmm\)学\(lct\)有几天了,大概整理一下这东西的题单吧 (部分参考flashhu的博客) 基础操作 [洛谷P1501Tree II] 题意 给定一棵树,要求支持 链加,删边加边,链乘,询 ...
- Java各国首都列表
国 家 名 称 首 都 中华人民共和国 People's Republic of China 北京 Beijing 蒙古 Mongolia 乌兰巴托 Elggydggmgj 朝鲜 Democrati ...
- 首都医科大学附属北京安贞医院全院级PACS系统采购项目[转]
项目名称:首都医科大学附属北京安贞医院全院级PACS系统采购项目 项目编号:TC140VCF0 采购人名称:首都医科大学附属北京安贞医院 采购人地址:北京市朝阳区安贞里 采购人联系方式:010-644 ...
- BZOJ3510 首都
题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...
- 【刷题】BZOJ 3510 首都
Description 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从 ...
随机推荐
- tomcat 测试页面显示
首先下载匹配jdk版本的tomcat 解压即可使用 将完成的html文件直接放置到webapps目录下的子目录中是无法使用的 原因是tomcat默认加载的是jsp文件,且需要文件配置 所以,除去在we ...
- Java 学习笔记及资源
Spring框架入门HelloWorld :http://www.importnew.com/13246.html (iteye 唐 博客,跟我学Sprint) Spring 框架下载地址:http ...
- visualvm远程监控jvm两种配置方法
参考:http://blog.itpub.net/17203031/viewspace-765810 一.Jstatd RMI远程监控方法 VisualVM在监控本地JVM的时候是很方便的.只要应用程 ...
- ASP.NET动态网站制作(30)-- WEBService
前言:继续讲正则表达式,然后介绍一下webservice. 内容: 1.匹配QQ号的正则表达式:^[1-9]\d{4,10}$:匹配手机号的正则表达式:^(0|86)?(13|14|15|18)[0- ...
- APP全局异常捕获,并保存本地文件
public class CrashHandler implements Thread.UncaughtExceptionHandler { public static final String TA ...
- POI1999(仓库管理员)
题目链接:传送门
- Python中MRO
MRO(方法解析顺序) 当有多重继承时,基于“从左到右,深度优先原则”: class CommonBase(): def Method(self): print('CommonBase') class ...
- Springboot 1.5.x版本上读取自定义配置文件问题
原来的解决方案: 现在1.5.x以后取消了location地址 1.5以后解决方案:
- TFS二次开发-基线文件管理器(1)-设计
CMMI在做基线文件管理的时候,常常是需要记录一部分基线文件的版本.并且这个基线文件记录也需要进行版本控制.TFS在做这件事的时候一般来说会选用标签(Lable)来做一系列文件的版本记录. 但是我发现 ...
- 【转】NPIV - 连接虚拟机与存储的桥梁
转自:http://blog.csdn.net/jewes/article/details/7705895 解决什么问题 我们知道在存储区域网络(SAN:storage area network),主 ...