UOJ207:共价大爷游长沙
题面
Sol
神题
给每个点对随机一个权值,把这两个点的权值异或上这个随机的值
用\(LCT\)维护子树信息,若子树异或和为所有点对的异或和那么就是答案
大常数代码
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(1e5 + 5);
IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
}
int n, m, ch[_][2], fa[_], size[_], sum[_], val[_], rev[_], S[_], top, Sum;
struct Edge{
int u, v, w;
} P[_ << 2];
# define ls ch[x][0]
# define rs ch[x][1]
IL bool Son(RG int x){
return ch[fa[x]][1] == x;
}
IL bool Isroot(RG int x){
return ch[fa[x]][0] != x && ch[fa[x]][1] != x;
}
IL void Reverse(RG int x){
if(!x) return;
rev[x] ^= 1; swap(ls, rs);
}
IL void Pushdown(RG int x){
if(!rev[x]) return;
Reverse(ls); Reverse(rs); rev[x] = 0;
}
IL void Update(RG int x){
sum[x] = val[x] ^ size[x] ^ sum[ls] ^ sum[rs];
}
IL void Rotate(RG int x){
RG int y = fa[x], z = fa[y], c = Son(x);
if(!Isroot(y)) ch[z][Son(y)] = x; fa[x] = z;
ch[y][c] = ch[x][!c]; fa[ch[y][c]] = y;
ch[x][!c] = y; fa[y] = x;
Update(y);
}
IL void Splay(RG int x){
S[top = 1] = x;
for(RG int y = x; !Isroot(y); y = fa[y]) S[++top] = fa[y];
while(top) Pushdown(S[top--]);
for(RG int y = fa[x]; !Isroot(x); Rotate(x), y = fa[x])
if(!Isroot(y)) Son(x) ^ Son(y) ? Rotate(x) : Rotate(y);
Update(x);
}
IL void Access(RG int x){
for(RG int y = 0; x; y = x, x = fa[x]){
Splay(x);
size[x] ^= sum[rs] ^ sum[y];
rs = y; Update(x);
}
}
IL void Makeroot(RG int x){
Access(x); Splay(x); Reverse(x);
}
IL void Link(RG int x, RG int y){
Makeroot(x); Makeroot(y); fa[x] = y;
size[y] ^= sum[x]; Update(y);
}
IL void Split(RG int x, RG int y){
Makeroot(x); Access(y); Splay(y);
}
IL void Cut(RG int x, RG int y){
Split(x, y); fa[x] = ch[y][0] = 0;
}
# define yyb 141905
# define lrh 141936
# define ni_dong_de +
int main(RG int argc, RG char* argv[]){
srand(yyb ni_dong_de lrh);
Input(); n = Input(); m = Input();
for(RG int i = 1, x, y; i < n; ++i)
x = Input(), y = Input(), Link(x, y);
for(RG int i = 1, tot = 0; i <= m; ++i){
RG int opt = Input(), x = Input(), y, u, v;
if(opt == 1){
y = Input(), u = Input(), v = Input();
Cut(x, y), Link(u, v);
}
else if(opt == 2){
P[++tot].u = x, P[tot].v = y = Input();
P[tot].w = rand() % 19260817;
Makeroot(x); val[x] ^= P[tot].w; Update(x);
Makeroot(y); val[y] ^= P[tot].w; Update(y);
Sum ^= P[tot].w;
}
else if(opt == 3){
Makeroot(P[x].u); val[P[x].u] ^= P[x].w; Update(P[x].u);
Makeroot(P[x].v); val[P[x].v] ^= P[x].w; Update(P[x].v);
Sum ^= P[x].w;
}
else{
y = Input(); Split(x, y);
if(sum[x] ^ Sum) puts("NO");
else puts("YES");
}
}
return 0;
}
UOJ207:共价大爷游长沙的更多相关文章
- [UOJ207]共价大爷游长沙
UOJ sol 这题真是太神啦! 对于S集合中的每个点对,给他们随机附上一个相同权值. 两个点在边(x,y)的两侧当且仅当一个点在x的子树中,另一个点不在x的子树中(假设x是y的儿子) 维护一下子树点 ...
- uoj207共价大爷游长沙
话说我可能还没有调出魔法森林呢...说好的lct第一题呢... 又是一个随机化的方法,毕竟又是判定性的问题 上次是判断无向图联通 这次是判断一些路径是否经过一条定边 若把路径上的边全部异或上一个路径的 ...
- uoj207 共价大爷游长沙 子树信息 LCT + 随机化 + 路径覆盖
题目传送门 http://uoj.ac/problem/207 题解 如果是一棵静态的树,有一个非常容易想到的算法:统计一下目前的每一个条边被几条路径经过,如果 \(x\) 到 \(y\) 的边的这个 ...
- 【LCT维护子树信息】uoj207 共价大爷游长沙
这道题思路方面就不多讲了,主要是通过这题学一下lct维护子树信息. lct某节点u的子树信息由其重链的一棵splay上信息和若干轻儿子子树信息合并而成. splay是有子树结构的,可以在rotate, ...
- 【UOJ207】共价大爷游长沙(Link-Cut Tree,随机化)
[UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们 ...
- 「UOJ207」共价大爷游长沙
「UOJ207」共价大爷游长沙 解题思路 : 快速判断两个集合是否完全相等可以随机点权 \(\text{xor}\) 的思路可以用到这道题上面,给每一条路径随机一个点权,维护出经过每一条边的点权的 \ ...
- UOJ #207. 共价大爷游长沙 [lct 异或]
#207. 共价大爷游长沙 题意:一棵树,支持加边删边,加入点对,删除点对,询问所有点对是否经过一条边 一开始一直想在边权上做文章,或者从连通分量角度考虑,比较接近正解了,但是没想到给点对分配权值所以 ...
- 【刷题】UOJ #207 共价大爷游长沙
火车司机出秦川,跳蚤国王下江南,共价大爷游长沙.每个周末,勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个 \(n\) 个点 \(n−1\) 条边的无向图,点编号为 \(1\) 到 ...
- UOJ #207. 共价大爷游长沙
#207. 共价大爷游长沙 链接:http://uoj.ac/problem/207 题意:给一棵树,要求支持加边.删边.询问一条边是否被所有路径覆盖.同时路径端点集合有加入与删除操作. 想法: 考虑 ...
- 【UOJ#207】共价大爷游长沙
题目链接 题目描述 火车司机出秦川,跳蚤国王下江南,共价大爷游长沙.每个周末,勤劳的共价大爷都会开车游历长沙市. 长沙市的交通线路可以抽象成为一个 \(n\) 个点 \(n−1\) 条边的无向图,点编 ...
随机推荐
- javamail+ical4j发送会议提醒
本篇讲述小编在使用ical4j时对其的理解与使用,留作笔记的同时希望能帮助到大家! 初学者可以先了解下ical4j的基本信息: iCalender编程基础,了解与使用ical4j:https://ww ...
- 隱藏在素數規律中的Pi -- BZOJ1041解題報告
退役狗在刷程書的過程中看到了一個有趣的視頻, 講解了一個有趣的問題. 在網上隨便搜索了一下居然還真的找到了一道以它爲背景的OI題目, BZOJ1041. 下面的內容會首先回顧一下視頻所討論的知識, 有 ...
- [HNOI2008] GT考试
[HNOI2008] GT考试 标签 : DP 矩阵乘法 题目链接 题意 n位数中不出现一个子串的方案数. 题解 \(设dp[i][j]\)为前i位匹配到j时的合法方案数.(所谓合法,就是不能有别的匹 ...
- NOI2009 二叉查找树 【区间dp】
[NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...
- Linux一些常用操作
1.linux swap分区 可采用文件的方式 dd if=/dev/zero of=/var/swap bs=1024 count=2048000 mkswap /var/swap swapon / ...
- HashMap原理阅读
前言 还是需要从头阅读下HashMap的源码.目标在于更好的理解HashMap的用法,学习更精炼的编码规范,以及应对面试. 它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而 ...
- Java经典编程题50道之五
利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. public class Example05 { public static ...
- 高可用之KeepAlived(一):基本概念和配置文件分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- java程序员理解js中的闭包
1.闭包概念: 就是函数内部通过某种方式访问一个函数内部的局部变量 再次理解: 闭包产生原因: 1.内部函数引用了外部函数的变量 作用:延长局部变量的生命周期 让函数外部可以调用到函数内部的数据 利用 ...
- php的ob函数实现页面静态化
首先介绍一下php中ob缓存常用到的几个常用函数ob_start():开启缓存机制ob_get_contents():获取ob缓存中的内容ob_clean()清除ob缓存中的内容,但不关闭缓存ob_e ...