XJOI网上同步训练DAY2 T2

【问题描述】

火车司机出秦川跳蚤国王下江南共价大爷游长沙。每个周末勤劳的共价大爷都会开车游历长沙市。

长沙市的交通线路可以抽象成为一个 个点 条边的无向图点编号为 任意两点间均存在恰好一条路径显然两个点之间最多也只会有一条边相连。有一个包含一些点对可重集合 共价大爷的旅行路线是这样确定的每次他会选择 中的某一对点 并从 出发沿着唯一路径到达

小L是共价大爷的脑残粉为了见到共价大爷的尊容小L决定守在这张图的某条边上等待共价大爷的到来。为了保证一定能见到他显然小L必须选择共价大爷一定会经过的边——也就是所有共价大爷可能选择的路径都经过的边

现在小L想知道如果他守在某一条边是否一定能见到共价大爷。

然而长沙市总是不断的施工也就是说可能某个时刻某条边会断开同时这个时刻一定也有某条新边会出现且任意时刻图都满足任意两点间均存在恰好一条路径的条件。注意断开的边有可能和加入的新边连接着相同的两个端点。共价大爷的兴趣也会不断变化所以也会不断加入新点对或者删除原有的点对。当然L也有可能在任何时候向你提出守在某一条边是否一定能见到共价大爷的问题。你能回答小L的所有问题吗

【输入格式】

从文件travel.in 中读入数据。

输入的第一行包含一个整数 表示测试数据编号如第一组数据的 样例数据的 可以忽略。

输入的第二行包含两个整数 分别表示图中的点数以及接下来会发生的事件数事件的定义下文中会有描述。初始时 为空。

接下来 行每行两个正整数 表示点 之间有一条无向边。

接下来 行每行描述一个事件每行的第一个数 表示事件的类型。

那么接下来有四个正整数 表示先删除连接点 的无向边保证存在这样的无向边然后加入一条连接点 的无向边保证操作后的图仍然满足题中所述条件。

那么接下来有两个正整数 表示在 中加入点对

那么接下来有一个正整数 表示删除第 个加入 中的点对即在第 的事件中加入 中的点对保证这个点对存在且仍然在 中。

那么接下来有两个正整数 表示小L询问守在连接点 的边上是否一定能见到共价大爷保证存在这样的无向边且此时 不为空。

【输出格式】

输出到travel.out中。

对于每个小L的询问输出“YES”或者“NO”均不含引号表示小L一定能或者不一定能见到共价大爷。

【样例输入1】

0

5 7

1 2

1 3

2 4

1 5

2 1 5

1 1 5 2 5

4 2 5

2 1 4

4 2 5

3 1

4 2 4

【样例输出1】

YES

NO

YES

【样例说明1】

最开始将点对 加入到 中此时点1和点5之间的路径是

接着将连接点1和点5的边断开加入连接点2和点5的边我们发现图仍然满足题中所述条件且点1和点5之间的路径是 经过点了2和点5之间的边因此第一个询问答案是YES。

接着将点对 加入到 中点1和点4之间的路径是 没有经过点2和点5之间的边因此第二个询问答案是NO。

接着我们删除了第一个加入到 中的点对也就是点对 此时 中唯一的点对就是 经过了点2和点4之间的边因此最后一个询问答案是YES。

【样例输入输出2】

见下发的travel / travel1.intravel / travel1.ans

【样例输入输出3】

见下发的travel / travel2.intravel / travel2.ans这组数据中

【数据规模和约定】


数据点


的规模


的规模


=


备注


1




1,2,3,4


2




2,4


3




2,4


4




2,3,4


5




2,3,4


6




1,2,3,4


任意时刻|


7




1,2,3,4


任意时刻|


8




1,2,3,4


9




1,2,3,4


10




1,2,3,4

对于所有数据

思路:本来想把边转换成点来做的,但是YY了一下发现,当把边拆掉的时候就不能维护信息了,题解的做法很玄妙:把每个路径的两个端点都异或上同一个随机值,然后询问的时候询问x子树和y子树内异或和是不是都等于ans,ans为每条边的随机值异或和。

  1 #include<algorithm>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<iostream>
  6 int ch[500005][2],rev[500005],sum[500005],o[500005];
  7 int fa[500005];
  8 int c[500005][3],st[500005],ans;
  9 int n,m,tot;
 10 int read(){
 11     int t=0,f=1;char ch=getchar();
 12     while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘) f=-1;ch=getchar();}
 13     while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();}
 14     return t*f;
 15 }
 16 bool isroot(int x){
 17     return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
 18 }
 19 void pushdown(int x){
 20     int l=ch[x][0],r=ch[x][1];
 21     if (rev[x]){
 22         rev[x]^=1;
 23         rev[l]^=1;rev[r]^=1;
 24         std::swap(ch[x][0],ch[x][1]);
 25     }
 26 }
 27 void updata(int x){
 28     int l=ch[x][0],r=ch[x][1];
 29     sum[x]=o[x]^sum[l]^sum[r];
 30 }
 31 void rotate(int x){
 32     int y=fa[x],f=ch[y][0]!=x;
 33     if (ch[y][f]=ch[x][f^1]) fa[ch[y][f]]=y;
 34     fa[x]=fa[y];if (!isroot(y)) ch[fa[y]][ch[fa[y]][0]!=y]=x;
 35     updata(ch[fa[y]=x][f^1]=y);
 36 }
 37 void splay(int x){
 38     int top=0;st[++top]=x;
 39     for (int i=x;!isroot(i);i=fa[i])
 40      st[++top]=fa[i];
 41     for (int i=top;i;i--) pushdown(st[i]);
 42     while (!isroot(x)){
 43         int y=fa[x],z=fa[y];
 44         if (!isroot(y)){
 45             if (ch[y][0]==x^ch[z][0]==y) rotate(x);
 46             else rotate(y);
 47         }
 48         rotate(x);
 49     }
 50     updata(x);
 51 }
 52 void access(int x){
 53     for (int t=0;x;t=x,x=fa[x]){
 54         splay(x);
 55         o[x]^=sum[t]^sum[ch[x][1]];
 56         ch[x][1]=t;
 57         updata(x);
 58     }
 59 }
 60 void makeroot(int x){
 61     access(x);splay(x);rev[x]^=1;
 62 }
 63 void link(int x,int y){
 64     makeroot(x);makeroot(y);fa[x]=y;o[y]^=sum[x];updata(y);
 65 }
 66 void cut(int x,int y){
 67     makeroot(y);access(y);
 68     splay(x);
 69     fa[x]=0;o[y]^=sum[x];updata(y);
 70 }
 71 void add(int x,int y){
 72     access(x);
 73     splay(x);
 74     o[x]^=y;
 75     updata(x);
 76 }
 77 int main(){
 78     int Id=read();
 79     n=read();m=read();
 80     srand(std::abs(n-m)*3+138);
 81     for (int i=1;i<n;i++){
 82         int x=read(),y=read();
 83         link(x,y);
 84     }
 85     while (m--){
 86         int type=read();
 87         if (type==1){
 88             int x=read(),y=read(),u=read(),v=read();
 89             cut(x,y);link(u,v);
 90         }else if (type==2){
 91             tot++;
 92             c[tot][0]=read();c[tot][1]=read();int z=rand();
 93             while (!z) z=rand();
 94             c[tot][2]=z;
 95             add(c[tot][0],z);add(c[tot][1],z);ans^=z;
 96         }else if (type==3){
 97             int k=read();
 98             add(c[k][0],c[k][2]);
 99             add(c[k][1],c[k][2]);
100             ans^=c[k][2];
101         }else{
102             int x=read(),y=read();
103             makeroot(x);access(y);
104             if (o[x]==ans&&o[y]==ans) puts("YES");
105             else puts("NO");
106         }
107     }
108 }
时间: 2024-11-03 01:21:49

XJOI网上同步训练DAY2 T2的相关文章

XJOI网上同步训练DAY2 T1

[问题描述] 为了迎接校庆月亮中学操场开始施工.不久后操场下发现了很多古墓这些古墓中有很多宝藏.然而学生们逐渐发现自从操场施工之后学校的运气就开始变得特别不好.后来经过调查发现古墓下有一个太守坟由于操场施工惊动了太守所以学校的运气才会特别不好. 你——月亮中学的学生之一为了拯救学校在梦中和太守进行了沟通.太守说“只要你能解决这个问题我就保佑你们从此事事顺心.你看操场下的古墓中有 个宝藏编号为 到 .现在你必须选择宝藏的一个集合可以不选或者全选.我有两种条件第一种条件有 个每一种条件形如‘如果你选

XJOI网上同步训练DAY6 T2

思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 int n,m; 7 double f[1005][1005]; 8 int pd[1005][1005]; 9 int read(){ 10 int t=0,f=1;char c

XJOI网上同步训练DAY3 T2

考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分询问,复杂度是O(nlogn),又get一种新的树链剖分打法 1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 #include<algorithm> 5 #include<cstrin

XJOI网上同步训练DAY1 T3

思路:一开始看到这题的时候想DP,可是发现貌似不行..因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊! 但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q的数量也确定了.所以序列长度也确定了,设m为序列长度. 而且对于每个a[i]都代表了一个固定数量的p和q和长度. 因此,长度大于m/2的前缀,我们可以用总的p和总的q减去它,转换成小于等于m/2长度的前缀后缀. 这样我们可以设计DP为f[i][j][k],代表从左往右i个中有j个p,从右往左i个有k

XJOI网上同步训练DAY6 T1

思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n个点拆成 我们枚举数字的最小公倍数 个,因为如果一个数模某个数等于0,那么模它的因数也一定是0,因此我们的思路就是拆点最短路. 1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<al

XJOI网上同步测试DAY14 T3

思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就把u到v的路径全部染色成0 最后只要询问缩点完的S到缩点完的T的路径上有多少是1就是答案了,最后复杂度:O(nlogn) 至于为什么这么做:因为我们要找必经过的边,这不就是桥吗,那我们先预处理出原来图的桥,然后把图转变成树,之后对于官道来说,它只要是连接了两个在同一个联通块里的点,就表明这段路绝对不

【BZOJ 4517】【SDOI 2016】Round1 Day2 T2 排列计数

本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看这道题,想到暴力算$组合数×错排$,我记得有一天晚上$Snayvals$问过我错排公式怎么推,但我并没有在意!!!幸亏我知道错排可以线性推出来,便开始用笔推错排公式.推了$30min$发现有计算机为什么不用!!!便打了一个表,很快就找出了规律$f[i]=(f[i-1]*f[i-2])*(i-1)$

tensorflow源码学习之五 -- 同步训练和异步训练

同步和异步训练是由optimizer来决定的. 1. 同步训练 同步训练需要使用SyncReplicasOptimizer,参考https://www.tensorflow.org/api_docs/python/tf/train/SyncReplicasOptimizer .其他optimizer都属于异步训练方式. 同步训练实现在sync_replicas_optimizer.py文件中的def apply_gradient()方法中.假设有n个参数: 对于PS,需要创建n个参数收集器(每个

2015 NOIP day2 t2 信息传递 tarjan

信息传递 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2661 Description 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里 获