http://uoj.ac/problem/207 (题目链接)

题意

  给出一棵无根树,4种操作:在路径集合中加入一条路径,在路径集合中删除一条路径,删一条边加一条边,查询一条边是否被集合中所有路径经过。

Solution

  将路径端点同时异或上一个值,那么如果一条路径被经过,那么它的子树中点的异或和一定等于所有路径的异或和。

  考虑如何用LCT维护这种可加减的子树信息。

  对于询问,我们将询问的点access一下,那么它的所有虚儿子就是它在真实的树中的所有儿子了。

  对于会使轻重边切换的操作:access,link,cut。注意同时更新虚儿子信息。

细节

  link的时候,两端点都要makeroot,否则作为父亲的一点无法更新祖先的信息。

代码

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<30)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std;const int maxn=300010;
int S,n,m,id,tot,fa[maxn];struct edge {int u,v,w;}e[maxn];
struct node {int son[2],val,sum,rev;  //val=x+虚儿子;sum=val+实儿子int& operator [] (int x) {return son[x];}
}tr[maxn];void reverse(int x) {swap(tr[x][0],tr[x][1]);tr[x].rev^=1;
}
void pushdown(int x) {if (tr[fa[x]][0]==x || tr[fa[x]][1]==x) pushdown(fa[x]);if (tr[x].rev) {if (tr[x][0]) reverse(tr[x][0]);if (tr[x][1]) reverse(tr[x][1]);tr[x].rev^=1;}
}
void pushup(int x) {tr[x].sum=tr[tr[x][0]].sum^tr[tr[x][1]].sum^tr[x].val;
}
void rotate(int x) {int y=fa[x],z=fa[y],l,r;l=tr[y][1]==x;r=l^1;if (tr[z][0]==y || tr[z][1]==y) tr[z][tr[z][1]==y]=x;fa[tr[x][r]]=y;fa[x]=z;fa[y]=x;tr[y][l]=tr[x][r];tr[x][r]=y;pushup(y);pushup(x);
}
void splay(int x) {pushdown(x);while (tr[fa[x]][0]==x || tr[fa[x]][1]==x) {int y=fa[x],z=fa[y];if (tr[z][0]==y || tr[z][1]==y) {if ((tr[z][0]==y) ^ (tr[y][0]==x)) rotate(x);else rotate(y);}rotate(x);}
}
void access(int x) {for (int y=0;x;y=x,x=fa[x]) {splay(x);tr[x].val^=tr[tr[x][1]].sum;tr[x].val^=tr[tr[x][1]=y].sum;pushup(x);}
}
void makeroot(int x) {access(x);splay(x);reverse(x);
}
void link(int x,int y) {makeroot(x);makeroot(y);  //一定要makeroot(y),否则无法更新y所在的splay上祖先的信息fa[x]=y;tr[y].val^=tr[x].sum;pushup(y);
}
void cut(int x,int y) {makeroot(x);access(y);splay(y);fa[x]=tr[y][0]=0;pushup(y);
}
void modify(int x,int val) {access(x);splay(x);tr[x].val^=val;tr[x].sum^=val;
}
bool query(int x,int y) {makeroot(x);access(y);  //access以后,y在实树上的儿子全为它的虚儿子return tr[y].val==S ? 1 : 0;
}int main() {scanf("%d%d%d",&id,&n,&m);for (int x,y,i=1;i<n;i++) {scanf("%d%d",&x,&y);link(x,y);}for (int op,x,y,z,i=1;i<=m;i++) {scanf("%d",&op);if (op==1) {scanf("%d%d",&x,&y);cut(x,y);scanf("%d%d",&x,&y);link(x,y);}if (op==2) {scanf("%d%d",&x,&y);e[++tot]=(edge){x,y,z=rand()};modify(x,z),modify(y,z);S^=z;}if (op==3) {scanf("%d",&x);S^=e[x].w;modify(e[x].u,e[x].w);modify(e[x].v,e[x].w);}if (op==4) {scanf("%d%d",&x,&y);puts(query(x,y) ? "YES" : "NO");}}return 0;
}

  

转载于:https://www.cnblogs.com/MashiroSky/p/6675292.html

【uoj207】 共价大爷游长沙相关推荐

  1. UOJ207 共价大爷游长沙

    考虑到路径是有向的,不是很好维护. 如果路径无向的话,可以直接转化为链加和查询操作. 既然有向的话,不妨考虑一波hash. 对于一组询问x,y,可以把树划分为两颗子树. 合法显然需要满足 x子树的起点 ...

  2. 【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息

    题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第 ...

  3. 【UOJ207】共价大爷游长沙【LCT】【异或】【随机化】

    传送门 题意:维护一棵无权树和一个路径集合SSS,支持以下操作: 断边连边 在SSS加入中加入一条路径 删除SSS中的一条路径 询问是否SSS中的所有路径都经过了边(x,y)(x,y)(x,y) n≤ ...

  4. [UOJ#207]共价大爷游长沙

    题目大意 一颗会动的树. 有一个点对集合会变. 每次询问一条树边,问集合内所有点对之间的路径是否都经过该边. 维护虚边信息的LCT 终于无聊来补了这题 每个点对随机一个10^9内的权值 然后给两端点的 ...

  5. ZJOI2019Round#1

    考的这么差二试基本不用去了 不想说什么了.就把这几天听课乱记的东西丢上来吧 这里是二试乱听课笔记ZJOI2019Round#2 ZJOI Round#1 Day1 M.<具体数学>选讲 罗 ...

  6. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  7. 跑出数字化升级“加速度”,腾讯云启产业基地“长沙模式”的探索

    文 | 曾响铃 来源 | 科技向令说(xiangling0815) 当互联网与产业加速融合,数字经济成为发展新引擎. 在长沙,2019年,深耕岩土工程自动化监测领域的湖南湘银河传感科技有限公司,借助湘 ...

  8. 画论38 董其昌《画禅室随笔》

    [中国历代画论目录] 目录 卷一 ◎论用笔 ◎评法书 ◎跋自书 ◎评古帖 卷二 ◎画诀 ◎画源 ◎题自画 ◎评旧画 卷三 ◎记事 ◎记游 ◎评诗 ◎评文 卷四 ◎杂言上 ◎杂言下 ◎楚中随笔 ◎禅悦 ...

  9. 书论66 董其昌《画禅室随笔》

    目录 卷一 论用笔 评法书 评古帖 卷二 画诀 画源 题自画 评旧画 论画 卷三 记事 记游 评诗 评文 卷四 杂言上 杂言下 楚中随笔 禅悦 卷一 论用笔 米海岳书,无垂不缩,无往不收.此八字真言, ...

最新文章

  1. 手机mvno怎么设置_微信透明背景壁纸怎么弄 手机设置方法教程分享
  2. 学习笔记《Java多线程编程实战指南》四
  3. Android之EasyPermissions源码解析
  4. php中表单的非空验证,Javascript的表单与验证-非空验证_javascript技巧
  5. JavaWeb学习之路——jsp与serverlet(一)
  6. 计算机工具软件未来的发展,2017年我国PC及工具软件的发展概况
  7. 在英特尔® 架构平台上开发和优化基于 NDK 的 Android 游戏应用
  8. python加法程序结果图片_OpenCV-Python系列之图像上的算术运算
  9. UIButton长度自适应文字长度
  10. iPhone屏幕尺寸
  11. 网站如何做引流推广?SEO引流效果好吗?
  12. 利用NATAPP隧道解决微信公众号开发之本地调试难题
  13. ViewBag的用法
  14. 数字图像处理复习(part1)
  15. 2022-2028全球与中国电动帆船市场现状及未来发展趋势
  16. spring boot check/token Principal 如何注入
  17. strace命令用法详解
  18. 【区块链】PoW、PoS、DPoS算法详解及对比
  19. ios重签名shell脚本_03:双层签名和重签名流程以及shell脚本重签名
  20. 走进JavaWeb技术世界5:初探Tomcat的HTTP请求过程

热门文章

  1. java三个技术平台_Java的3个平台有什么区别
  2. vue import request from ‘@/xxx/xxx‘,@是什么意思怎样配置
  3. RabbitMQ:消息发送确认 与 消息接收确认(ACK)
  4. ES启动错误 ERROR: the system property [es.path.conf] must be set
  5. 马斯克的挖隧道公司再下一城,未来或将首次实现短途通勤
  6. Sublime text3的安装配置
  7. 南理工14级第4组软件课程设计报告
  8. 集成tomcat插件到eclipse
  9. CCNP精粹系列之十三-----OSPF路由汇总
  10. oracle帮助文档_Spring Boot Config文档,使用IntelliJ IDEA的两种方法