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

#include<iostream>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#define N 330000
#define L 300000
#define eps 1e-7
#define inf 1e9+7
#define db double
#define ll long long
#define ldb long double
using namespace std;
inline int read()
{char ch=0;int x=0,flag=1;while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*flag;
}
#define lson son[x][0]
#define rson son[x][1]
struct lnk{int x,y,z;}p[N];
int va[N],vb[N],sa[N],sb[N],sa_[N],sb_[N],f[N],st[N],flag[N],son[N][2];
bool get(int x){return son[f[x]][1]==x;}
bool isroot(int x){return (son[f[x]][0]!=x)&&(son[f[x]][1]!=x);}
void pushup(int x)
{sa[x]=sa[lson]^sa[rson]^sa_[x]^va[x];sb[x]=sb[lson]^sb[rson]^sb_[x]^vb[x];
}
void update(int x){flag[x]^=1;swap(lson,rson);}
void pushdown(int x){if(!flag[x])return;if(lson)update(lson);if(rson)update(rson);flag[x]=0;}
void rotate(int x)
{int y=f[x],z=f[y],tx=get(x),ty=get(y),p=son[x][!tx];if(!isroot(y))son[z][ty]=x;son[x][!tx]=y;son[y][tx]=p;if(p)f[p]=y;f[y]=x;f[x]=z;pushup(y);pushup(x);
}
void splay(int x)
{int cnt=0,tmp=x;st[++cnt]=x;while(!isroot(x))st[++cnt]=f[x],x=f[x];for(int i=cnt;i>=1;i--)pushdown(st[i]);x=tmp;while(!isroot(x)){int y=f[x];if(!isroot(y))rotate(get(x)==get(y)?y:x);rotate(x);}pushup(x);
}
void access(int x)
{for(int y=0;x;y=x,x=f[x]){splay(x);sa_[x]^=sa[rson];sb_[x]^=sb[rson];rson=y;sa_[x]^=sa[rson];sb_[x]^=sb[rson];pushup(x);}
}
void makeroot(int x){access(x);splay(x);update(x);}
void link(int x,int y)
{makeroot(x);access(y);splay(y);f[x]=y;sa_[y]^=sa[x];sb_[y]^=sb[x];pushup(y);
}
void cut(int x,int y)
{makeroot(x);access(y);splay(y);f[x]=son[y][0]=0;pushup(y);
}
void add1(int x,int k){makeroot(x);va[x]^=k;pushup(x);}
void add2(int x,int k){makeroot(x);vb[x]^=k;pushup(x);}
int rng(){int x=0;for(int i=0;i<=30;i++)x^=(rand()%2)<<i;return x;}
int main()
{srand(time(0));read();int n=read(),m=read(),cnt=0,s=0;for(int i=1;i<n;i++){int x=read(),y=read();link(x,y);}for(int i=1;i<=m;i++){int flag=read();if(flag==1){int x,y;x=read();y=read();cut(x,y);x=read();y=read();link(x,y);}if(flag==2){cnt++;p[cnt].x=read();p[cnt].y=read();p[cnt].z=rng();add1(p[cnt].x,p[cnt].z);add2(p[cnt].y,p[cnt].z);s^=p[cnt].z;}if(flag==3){int k=read();add1(p[k].x,p[k].z);add2(p[k].y,p[k].z);s^=p[k].z;}if(flag==4){int x=read(),y=read();makeroot(x);access(y);int a=sa_[y]^va[y],b=sb_[y]^vb[y]; if((a^b)==s)printf("YES\n");else printf("NO\n");}}return 0;
}

转载于:https://www.cnblogs.com/Creed-qwq/p/10354399.html

UOJ207 共价大爷游长沙相关推荐

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

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

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

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

  3. 【uoj207】 共价大爷游长沙

    http://uoj.ac/problem/207 (题目链接) 题意 给出一棵无根树,4种操作:在路径集合中加入一条路径,在路径集合中删除一条路径,删一条边加一条边,查询一条边是否被集合中所有路径经 ...

  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. ROM、RAM、IROM、IRAM、DRAM、SRAM、Flash介绍
  2. C++实现学生成绩管理系统
  3. linux 安装库 编译提示-lcrypto 无法链接,缺少 crypto 库
  4. 关于报表中汇率转换的问题
  5. Java Bootstrap:Dropwizard与Spring Boot
  6. 《人人都是产品经理》读后感
  7. sharding分表后主键_分库分表【Sharding-JDBC】入门与项目实战
  8. 企业要做有价值的私域流量三大关键
  9. 深入分析AsyncTask
  10. PHP导出MySQL数据字典 Summer-Mysql-Dic
  11. mysql not in 或 in 优化
  12. 【优化预测】基于matlab狼群算法优化BP神经网络预测【含Matlab源码 658期】
  13. 使用MagicRecon在挖洞时最大化数据收集量
  14. 一分钟快速了解内网穿透软件有哪些
  15. ideaIU-2019.3.3 百度云下载链接
  16. 维基百科的语料库下载以及后续操作(一)2020年6月【包括opencc下载避雷,繁转简】
  17. iOS开发APP瘦身之PDF图片资源加载框架
  18. Unity中的角色属性芒星比例图
  19. 每月缴的个税,你知道怎么算的吗?
  20. 标准库之正则表达式3-前后向管理

热门文章

  1. Linux 系统启动流程图/系统初始化流程图
  2. Linux 命令之 iwlist 命令-从无线网卡获取更详细的无线信息
  3. python实现var模型_copula函数及其Var计算的Python实现
  4. 网络位置可以看到另一个人的电脑_计算机组成原理(一)- 冯·诺依曼体系结构...
  5. mysql的锁是公平的么_lock 默认公平锁还是非公平锁?公平锁是如何定义?如何实现...
  6. C++ 11 深度学习(九)C++文件IO
  7. python2.7.10安装教程_Linux系统(CentOS)下python2.7.10安装
  8. js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%
  9. 有没有code能改xml内容_Spring源码解析-applicationContext.xml加载和bean的注册
  10. css初始化_利用CSS变量实现炫酷的悬浮效果