题目传送门

还是维护子树信息。

但是这里多了一个找重心的操作。

这里有一个关于树重心的结论,据说可以用反证法证明。反正我不会证

就是:新的重心一定在原来两个重心之间的那条树链上。

这样我们逐步缩小搜索范围,就可以很快地找到新树的重心了。

另外,每次找重心太慢了,用并查集维护一下每个点所在的树重心。

其他的就没什么特别了。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define id(x) (s[f[x]][1]==x)
using namespace std; int n,m;
int s[][],f[];
int sz[],szi[];
int rev[],rt[];
int ff[]; int findfa(int x)
{
if(x==ff[x])return x;
ff[x]=findfa(ff[x]);
return ff[x];
} void pushup(int p)
{
sz[p]=sz[s[p][]]+sz[s[p][]]+szi[p]+;
} void reverse(int p)
{
swap(s[p][],s[p][]);
rev[p]^=;
} void pushdown(int p)
{
if(!rev[p])return;
reverse(s[p][]);
reverse(s[p][]);
rev[p]=;
} void rotate(int p)
{
int k=id(p);
int fa=f[p];
if(rt[fa])rt[p]=,rt[fa]=;
else s[f[fa]][id(fa)]=p;
s[fa][k]=s[p][!k];
s[p][!k]=fa;
f[p]=f[fa];
f[fa]=p;
f[s[fa][k]]=fa;
pushup(fa);
pushup(p);
} void down(int p)
{
if(!rt[p])down(f[p]);
pushdown(p);
} void splay(int p)
{
down(p);
while(!rt[p])
{
int fa=f[p];
if(rt[fa])
{
rotate(p);
return;
}
if(id(p)^id(fa))rotate(p);
else rotate(fa);
rotate(p);
}
} void access(int p)
{
int son=;
while(p)
{
splay(p);
szi[p]+=sz[s[p][]];
rt[s[p][]]=,rt[son]=;
s[p][]=son;
szi[p]-=sz[s[p][]];
pushup(p);
son=p,p=f[p];
}
} void mtr(int p)
{
access(p);
splay(p);
reverse(p);
} void isolate(int x,int y)
{
mtr(x);
access(y);
splay(y);
} int nueva(int p)
{
int l,r,sum=sz[p]>>,tot=sz[p]&,lsum=,rsum=,ng=n+,nl,nr;
while(p)
{
pushdown(p);
l=s[p][],r=s[p][];
nl=sz[l]+lsum,nr=sz[r]+rsum;
if(nl<=sum&&nr<=sum)
{
if(tot)
{
ng=p;
break;
}else
if(ng>p)ng=p;
}
if(nl<nr)lsum+=sz[l]+szi[p]+,p=r;
else rsum+=sz[r]+szi[p]+,p=l;
}
splay(ng);
return ng;
} int xsum; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
sz[i]=rt[i]=;
ff[i]=i;
xsum^=i;
}
for(int i=;i<=m;i++)
{
char op[];
scanf("%s",op+);
if(op[]=='A')
{
int x,y;
scanf("%d%d",&x,&y);
isolate(x,y);
f[x]=y;
szi[y]+=sz[x];
pushup(y);
x=findfa(x),y=findfa(y);
isolate(x,y);
int ng=nueva(y);
xsum=xsum^x^y^ng;
ff[x]=ff[y]=ff[ng]=ng;
}
if(op[]=='Q')
{
int x;
scanf("%d",&x);
printf("%d\n",findfa(x));
}
if(op[]=='X')printf("%d\n",xsum);
}
return ;
}

[洛谷P4299] 首都的更多相关文章

  1. 洛谷P4299 首都(BZOJ3510)(LCT,树的重心,二分查找)

    Update:原来的洛谷U21715已成坑qwq 已经被某位管理员巨佬放进公共题库啦!又可以多一个AC记录啦! 洛谷题目传送门 其实也可以到这里交啦 思路分析 动态维护树的重心 题目中说到国家的首都会 ...

  2. 洛谷4299首都(LCT维护动态重心+子树信息)

    这个题目很有意思 QWQ 根据题目描述,我们可以知道,首都就是所谓的树的重心,那么我们假设每颗树的重心都是\(root\)的话,对于每次询问,我们只需要\(findroot(x)\)就可以. 那么如何 ...

  3. 洛谷P3345 [ZJOI2015]幻想乡战略游戏(动态点分治,树的重心,二分查找,Tarjan-LCA,树上差分)

    洛谷题目传送门 动态点分治小白,光是因为思路不清晰就耗费了不知道多少时间去gang这题,所以还是来理理思路吧. 一个树\(T\)里面\(\sum\limits_{v\in T} D_vdist(u,v ...

  4. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  5. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  6. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  7. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  8. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  9. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

随机推荐

  1. 连词词组|relax|brings about a rise in|Chance are (high)that|Have no clue|Be passionate about|Tedious|overwhelmed by piles of

    efficient有效率的 effective有效果的 Make sb. Do Stuff没有复数 首先的三种表述:First off=To begin with=For starters 其次:Ad ...

  2. win10环境下pyinstaller打包pytorch遇到的问题及解决方案

    pytorch-python源码生成windows的应用程序(.exe),报错OSError: could not get source code Failed to execute script h ...

  3. Bless All

    # php code $i = 2333 $myJXOI = JXOI() while($i == 2333){ ++myJXOI.score , ++myJXOI.rp , --myJXOI.常数 ...

  4. Codeforces Round #624 (Div. 3)(题解)

    A. Add Odd or Subtract Even 思路: 相同直接为0,如果两数相差为偶数就为2,奇数就为1 #include<iostream> #include<algor ...

  5. docker 一些简略环境搭建及部分链接

    1.center 7  搭建 docker https://www.cnblogs.com/yufeng218/p/8370670.html 2.docker 命令 https://www.cnblo ...

  6. Matlab高级教程_第一篇:Matlab基础知识提炼_02

    第三节:变量 正如其他编程软件一样. 都是通过变量来传递和交换数据的,这是基础.按照<MATLAB基础知识提炼>这篇文章先介绍变量比较合适.编程语言不外乎包括两部分:数据和结构.应该先把数 ...

  7. nips2014下载

    nips2014下载 wget http://papers.nips.cc/book/advances-in-neural-information-processing-systems-27-2014 ...

  8. js时间与日期

    var box = new Date(); //创建了一个日期对象:构造方法里面可以传参数,指定时间.如果没有传,就是默认当前时间alert(box); alert(Date.parse('4/12/ ...

  9. Vue其他指令-组件-全局-局部-组件的交互父传子

    v-once指令 once:一旦,当...时候 <!DOCTYPE html> <html lang="zh"> <head> <meta ...

  10. Windows系统清理

    @echo off del/f/s/q %systemdrive%\*.tmp del/f/s/q %systemdrive%\*._mp del/f/s/q %systemdrive%\*.log ...