LGOJ4299 首都
这题是 \(LCT\) 维护子树信息中的 \(LCT\) 维护重心
Description
题意概述:给定一个森林,要求支持以下操作
1.链接两个点
2.求一个点所在树的重心
3.求所有重心编号的异或和
Solution
\]
看到有链接和询问操作的题目,我们想到了\(LCT\)
首先是一些重心的性质,本题可以用到:
\(1.\) 点到树上所有点的距离和最小的那个点就是中心
\(2.\) 重心在添加一条边之后只会移动最多一条边的距离
\(3.\) 如果我们联通森林里的两棵树,那么新树的重心就在原两树重心的路径上
应该都由重心的定义理解啥的易证吧\(2333\)
然后我们在处理 \(2\) 操作的时候搞个并查集(\(findroot\)好像很慢)
处理 \(3\) 操作的时候直接在链上进行类似二分查找的东西,看两侧子树的大小关系
\]
\(P.s.\)博主知道应该是\(QED\)
Code
#include <bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm {
inline int read() {
int res = 0, f = 1;
char k;
while (!isdigit(k = getchar()))
if (k == '-')
f = -1;
while (isdigit(k)) res = res * 10 + k - '0', k = getchar();
return res * f;
}
const int N = 3e5 + 10, inf = 1e15 + 10;
int f[N], c[N][2], s[N], st[N], si[N], n, m, fa[N];
bool r[N];
inline void push_up(int x) { return s[x] = s[c[x][1]] + s[c[x][0]] + si[x] + 1, void(); }
inline bool notroot(int x) { return c[f[x]][0] == x || c[f[x]][1] == x; }
inline void push_down(int x) {
if (r[x]) {
swap(c[x][0], c[x][1]);
r[c[x][0]] ^= 1;
r[c[x][1]] ^= 1;
}
return r[x] = 0, void();
}
inline void push_all(int x) {
if (notroot(x))
push_all(f[x]);
push_down(x);
return;
}
inline void rotate(int x) {
int y = f[x], z = f[y], k = (c[y][1] == x), w = c[x][!k];
if (notroot(y))
c[z][c[z][1] == y] = x;
c[x][!k] = y;
c[y][k] = w;
if (w)
f[w] = y;
f[y] = x;
f[x] = z;
return push_up(y);
}
inline void splay(int x) {
push_all(x);
while (notroot(x)) {
int y = f[x], z = f[y];
if (notroot(y))
rotate((c[y][0] == x) ^ (c[z][0] == y) ? x : y);
rotate(x);
}
return push_up(x);
}
inline void access(int x) {
for (int y = 0; x; x = f[y = x]) {
splay(x);
si[x] += s[c[x][1]], si[x] -= s[c[x][1] = y];
push_up(x);
}
return;
}
inline void makeroot(int x) {
access(x);
splay(x);
r[x] ^= 1;
return;
}
inline void split(int x, int y) {
makeroot(x);
access(y);
splay(y);
return;
}
inline void link(int x, int y) {
split(x, y);
si[f[x] = y] += s[x];
push_up(y);
return;
}
inline int get(int x) { return fa[x] == x ? x : fa[x] = get(fa[x]); }
inline int update(int x) {
int l, r, ji = s[x] & 1, sum = s[x] >> 1, lsum = 0, rsum = 0, newp = inf, nl, nr;
while (x) {
push_down(x);
nl = s[l = c[x][0]] + lsum;
nr = s[r = c[x][1]] + rsum;
if (nl <= sum && nr <= sum) {
if (ji) {
newp = x;
break;
} else if (newp > x)
newp = x;
}
if (nl < nr)
lsum += s[l] + si[x] + 1, x = r;
else
rsum += s[r] + si[x] + 1, x = l;
}
return splay(newp), newp;
}
signed main() {
int n = read(), m = read(), x, y, z, ans = 0;
for (int i = 1; i <= n; ++i) s[i] = 1, fa[i] = i, ans ^= i;
while (m--) {
string s;
cin >> s;
if (s == "A") {
x = read();
y = read();
link(x, y);
split(x = get(x), y = get(y));
z = update(y);
ans = ans ^ x ^ y ^ z;
fa[x] = fa[y] = fa[z] = z;
} else if (s == "Xor")
printf("%lld\n", ans);
else
printf("%lld\n", get(read()));
}
return 0;
}
} // namespace yspm
signed main() { return yspm::main(); }
LGOJ4299 首都的更多相关文章
- luogu P4299 首都
题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...
- 洛谷P4299 首都(BZOJ3510)(LCT,树的重心,二分查找)
Update:原来的洛谷U21715已成坑qwq 已经被某位管理员巨佬放进公共题库啦!又可以多一个AC记录啦! 洛谷题目传送门 其实也可以到这里交啦 思路分析 动态维护树的重心 题目中说到国家的首都会 ...
- 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国将永远从 ...
- 【bzoj3510】首都 LCT维护子树信息(+启发式合并)
题目描述 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打败了B国,那么B国将永远从这个星球消失, ...
- P4299 首都
题目 P4299 首都 做法 这题是动态维护树的重心,连边后找到两棵树的重心拉一条链(性质:新重心在链上),然后暴力爬 要注意: 1.是找重心的过程中要先把旋转标记放下来,因为\(Splay(x)\) ...
- 【BZOJ3510】首都 LCT维护子树信息+启发式合并
[BZOJ3510]首都 Description 在X星球上有N个国家,每个国家占据着X星球的一座城市.由于国家之间是敌对关系,所以不同国家的两个城市是不会有公路相连的. X星球上战乱频发,如果A国打 ...
随机推荐
- yolov3测试自己的数据
yolov3测试自己的数据 前言 上一篇我已经介绍了利用yolov3预训练权重文件(只包含卷积层)并训练 只需要进行如下编译: ./darknet detector train cfg/voc.dat ...
- 用四种方法将两个AJAX改为同步
用四种方法将两个AJAX改为同步 Promise.Generator函数.yield.async/await 相关 今有一题,题目为: 现有ajax1()和ajax2(),用于快速初始化CODE1和C ...
- java 九数组分数
九数组分数 1,2,3-9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. public class A { public static vo ...
- P1057 数零壹
P1057 数零壹 转跳点:
- 内存寻址能力与CPU的位宽有关系吗?
答案是:没有关系.CPU的寻址能力与它的地址总线位宽有关,而我们通常说的CPU位宽指的是数据总线位宽,它和地址总线位宽半毛钱关系也没有,自然也与寻址能力无关. 简单的说,CPU位宽指的是一个时钟周期内 ...
- SSM文件上传要点总结
文件的上传要点: 1.表单方面:enctype="multitype/form-data" 编码方式选择混编码 input 类型采用file 2.实体类一定要进行序列化,也就是im ...
- 洛谷 三月月赛 B
搞出每一位与前一位的差,然后区间修改只是会影响区间的端点,所以只修改一下端点的值就好. %%%高一神犇线段树 #include<bits/stdc++.h> #define N 10000 ...
- 七十九、SAP中数据库操作之更新数据,UPDATE的用法
一.我们查看SFLIGHT数据库,比如我们需要改这条数据 二.代码如下 三.执行效果如下,显示“数据更新成功” 四.我们来看一下SFLIGHT数据库,发现已经由DEM更改为了AAA了
- Vue.js(25)之 vue全局配置api介绍
本文介绍的全局api并不在Vue的构造函数内,而是在Vue构造器外面提供这些方法,让我们扩展新功能. 1. vue.extend(options) 参考:https://www.w3cplus.com ...
- Maven与nexus关系
一.了解Maven,Maven用来干什么呢 1. 优秀的构建工具 通过简单的命令,能够完成清理.编译.测试.打包.部署等一系列过程.同时,不得不提的是,Maven是跨平台的,无论是在Windows.还 ...