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国打 ... 
随机推荐
- P1085 PAT单位排行
			转跳点: 
- idea开发springboot 的mysql数据库连接问题
			今天在家用idea进行springboot开发,前面一些坑相对避免了,但是到数据库这块总是连接不上,报错主要是: Access denied for user 'root'@'localhost' ( ... 
- tomcat端口号被占用,且杀进程不能够杀掉解决办法
			在电脑上安装了zookeeper以后,配置好tomcat启动发现端口号8009端口号被占用,报错如下: 采用netstat –ano 查询所有进程查看或者根据端口号查进程netstat -ano |f ... 
- centos-6更新yum源(163)
			更新前请先备份原来的repo文件,养成好习惯 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak 到http://mirrors ... 
- spark集群硬件建议
			ps:硬件配置其实都是根据实际的情况的,没有说某种配置就可以套在各种场景上 大部分spark 任务都是要到外部存储系统去读取数据源,比如hdfs,hbase等等,让spark计算尽可能近的数据源是很重 ... 
- Ajax请求传递数组参数的方法
			方法一:拼接字符串参数 var arr={params:['param','param2']}; $.ajax({url:请求地址, data:arr, type:"POST", ... 
- 装饰者模式(Decorator Pattern)C#版本的
			仍然来自 zhili https://www.cnblogs.com/zhili/p/DecoratorPattern.html 谢谢啊 呵呵 ---------------------------- ... 
- centos破解压缩文件密码
			rarcrack是linux系统端的一款破解加密压缩包的工具,rarcrack使用的穷举法进行破解已经加密的rar.zip和7z压缩包,支持设置多线程,和文件类型进行破解. 1.rarcrack下载页 ... 
- EUI库 - 皮肤
			皮肤分离机制 皮肤分离机制对制作可复用的外观比较有优势 那对于只使用一次的皮肤呢?如果也拆分出两个文件,显然不太方便.这里我们针对单次使用的皮肤定制了内部类的功能 每个组件都有一个chi ... 
- 19 01 18 dango  模型
			定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模型只能 ... 
