P3950 部落冲突 (LCT暴力)

题目背景

在一个叫做Travian的世界里,生活着各个大大小小的部落。其中最为强大的是罗马、高卢和日耳曼。他们之间为了争夺资源和土地,进行了无数次的战斗。期间诞生了众多家喻户晓的英雄人物,也留下了许多可歌可泣的动人故事。

其中,在大大小小的部落之间,会有一些道路相连,这些道路是Travian世界里的重要枢纽,简单起见,你可以把这些部落与部落之间相连的道路看作一颗树,可见每条道路对于Travian世界的重要程度。有了这些道路,建筑工人就可以通过这些道路进行友好外交啦。

然而,事情并不会像想象的那样美好,由于资源的匮乏,相邻的部落(由一条道路相连的部落)之间经常会发生大大小小的冲突事件,更有甚者,会升级为部落之间的大型战争。

为了避免误伤,每当两个相邻的部落之间发生大型战争之时,这两个部落间的道路是不允许通行的,对于一些强大的部落,甚至能与多个相邻的部落同时开战,同样的,这些战争地带的道路十分危险,是不可通行的。

天下之势,分久必合,当两个部落经历了不打不相识的苦战之后,他们可以签订停战协议(暂时停战,以后依旧可能再次开战),这样,两个部落之间的道路又会重新恢复为可通行状态,建筑工人们又可以经过此地购买最新的大本营设计图纸来强大自己的部落了。

为了简单起见,我们把各大战争事件按发起的时间顺序依次编号(最先发起的战争编号就为 1,第二次战争编号就为 2,以此类推),当两个部落停战之时,则会直接告诉你这场战争的编号,然后这场战争就载入了史册,不复存在了,当然,这并不会影响到其他战争的编号。

建筑工人十分讨厌战争,因为战争,想从一个部落到另一个部落进行友好交流的建筑工人可能就此白跑一趟。所以,在他们出发之前,都会向你问问能不能到达他们想去的部落。

题目描述

简单起见,你就是要处理下面三件事,所有的事件都是按照时间顺序给出的。

1.QQQ ppp qqq)从第 ppp 个部落出发的建筑工人想知道能否到达第 qqq 个部落了,你要回答的便是(Yes/No),注意大小写

2.CCC ppp qqq)ppp 个部落与第 qqq 个部落开战了,保证他们一定是相邻的部落,且目前处于停战(未开战)状态

3.UUU xxx )xxx 次发生的战争结束了,它将永远的被载入史册,不复存在(保证这个消息不会告诉你多次)

输入输出格式

输入格式:

 

第一行两个数 nnn 和 mmm, nnn 代表了一共有 nnn 个部落,mmm 代表了以上三种事件发生的总数

接下来的 n−1n - 1n1 行,每行两个数 ppp , qqq,代表了第 ppp 个部落与第 qqq 个部落之间有一条道路相连

接下来的 mmm 行,每行表示一件事,详见题目描述

 

输出格式:

 

每行一个“YesYesYes”或者“NoNoNo”,表示从第 ppp 个部落出发的建筑工人能否到达第 qqq 个部落

 

输入输出样例

输入样例#1: 复制
5 9
1 2
2 3
3 4
4 5
Q 1 4
C 2 1
C 4 3
Q 3 1
Q 1 5
U 1
U 2
C 4 3
Q 3 4
输出样例#1: 复制
Yes
No
No
No
输入样例#2: 复制
10 10
1 2
1 3
3 4
3 5
1 6
3 7
1 8
2 9
5 10
C 8 1
Q 6 1
C 2 1
Q 2 10
U 1
C 9 2
C 7 3
U 3
Q 6 7
Q 1 10
输出样例#2: 复制
Yes
No
No
Yes
输入样例#3: 复制
20 20
1 2
1 3
2 4
1 5
1 6
4 7
1 8
2 9
5 10
1 11
2 12
7 13
1 14
1 15
11 16
4 17
3 18
18 19
8 20
Q 13 5
C 14 1
C 16 11
U 1
U 2
C 20 8
Q 7 1
C 7 4
Q 17 17
Q 1 6
C 16 11
C 2 1
Q 16 2
U 3
U 5
U 6
C 2 1
C 6 1
C 13 7
C 11 1
输出样例#3: 复制
Yes
Yes
Yes
Yes
No

说明

对于30%的数据 1<=n,m<=6000

对于另30%的数据,保证部落之间的地理关系是一条链,且 i 与 i + 1 之间有一条道路

对于另30%的数据,1<=n,m<=100000

对于100%的数据,1<=n,m<=300000

SOLUTION:

开战cut,停战link,询问findroot判连通性

太无脑,

CODE:

  1 #include"bits/stdc++.h"
  2 using namespace std;
  3 #define I inline
  4 #define ls ch[x][0]
  5 #define rs ch[x][1]
  6 #define R register
  7 const int N = 300010;
  8 
  9 
 10 int ch[N][2],fa[N],r[N];
 11 
 12 template <typename _tp> inline _tp in(_tp&x)
 13 {
 14     char ch=getchar(),sgn=0;
 15     x=0;
 16     while(ch^'-'&&!isdigit(ch))
 17         ch=getchar();
 18     if(ch=='-')
 19         ch=getchar(),sgn=1;
 20     while(isdigit(ch))
 21         x=x*10+ch-'0',ch=getchar();
 22     if(sgn)
 23         x=-x;
 24     return x;
 25 }
 26 I void pushup(R int x) {}
 27 I void pushr(R int x)
 28 {
 29     swap(ls,rs);
 30     r[x]^=1;
 31 }
 32 I void pushdown(R int x)
 33 {
 34     if(r[x])
 35     {
 36         if(ls)
 37             pushr(ls);
 38         if(rs)
 39             pushr(rs);
 40         r[x]=0;
 41     }
 42 }
 43 I int nroot(R int x)
 44 {
 45     return ch[fa[x]][0]==x||ch[fa[x]][1]==x;
 46 }
 47 I void downall(R int x)
 48 {
 49     if(nroot(x))
 50         downall(fa[x]);
 51     pushdown(x);
 52 }
 53 I void rot(R int x)
 54 {
 55     int y=fa[x],z=fa[y],k=ch[y][1]==x,w=ch[x][!k];
 56     if(nroot(y))
 57         ch[z][ch[z][1]==y]=x;
 58     ch[x][!k]=y;
 59     ch[y][k]=w;
 60     if(w)
 61         fa[w]=y;
 62     fa[y]=x;
 63     fa[x]=z;
 64     pushup(y);
 65 }
 66 I void splay(R int x)
 67 {
 68     downall(x);
 69     while(nroot(x))
 70     {
 71         int y=fa[x],z=fa[y];
 72         if(nroot(y))
 73             rot((ch[y][0]==x)^(ch[z][0]==y)?x:y);
 74         rot(x);
 75     }
 76     pushup(x);
 77 }
 78 I void access(R int x)
 79 {
 80     for(int y=0; x; y=x,x=fa[x])
 81         splay(x),rs=y,pushup(x);
 82 }
 83 I int makeroot(R int x)
 84 {
 85     access(x);
 86     splay(x);
 87     pushr(x);
 88 }
 89 I int findroot(R int x)
 90 {
 91     access(x);
 92     splay(x);
 93     while(ls)
 94         pushdown(x),x=ls;
 95     splay(x);
 96     return x;
 97 }
 98 I void link(R int x,R int y)
 99 {
100     makeroot(x);
101     if(findroot(y)!=x)
102         fa[x]=y;
103 }
104 I void cut(R int x,R int y)
105 {
106     makeroot(x);
107     if(findroot(y)==x&&fa[y]==x&&!ch[y][0])
108     {
109         fa[y]=ch[x][1]=0;
110         pushup(x);
111     }
112 }
113 int va[N],vb[N];
114 int  p;
115 int n,m;
116 
117 int main()
118 {
119 
120 
121     in(n),in(m);
122     for(int i=1; i<n; i++)
123     {
124         int l,r;
125         in(l),in(r);
126         link(l,r);
127     }
128     while(m--)
129     {
130         char s;
131         cin>>s;
132         if(s=='Q')
133         {
134             int l,r;
135             in(l),in(r);
136             makeroot(l);
137             findroot(r)==l?puts("Yes"):puts("No");
138         }
139         else if(s=='C')
140         {
141             int l,r;
142             in(l),in(r);
143             cut(l,r);
144             va[++p]=l,vb[p]=r;
145         }
146         else
147         {
148             int k;
149             in(k);
150             link(va[k],vb[k]);
151         }
152     }
153 }
原文地址:https://www.cnblogs.com/zhangbuang/p/11166913.html