题目背景

在一个叫做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 - 1n−1 行,每行两个数 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

这题是树链剖分的模板题

但会卡常数,只有90分

所以这里用树状数组维护差分

首先按轻重链dfs序编号in[x]和out[x]

一个点的子树范围为in[x]~out[x]

对于一个点值为1表示与父亲是否连通,前缀和c[x]就表示他到根有多少路连通

开始每一个点都是1如果c[p]+c[q]-2*c[lca]==dep[p]+dep[q]-2*dep[lca]就输出yes

如果要把一个点与父亲的边赋为0,那么给in[x]~out[x]的前缀和-1就行了

赋为1同理

于是用小常数的树状数组就可以AC

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 using namespace std;
  6 struct Node
  7 {
  8   int next,to;
  9 }edge[600001];
 10 int head[300001],num,c[600001],in[300001],out[300001],tot,cnt,n,m;
 11 int Q[300001],dep[300001],size[300001],son[300001],top[300001],fa[300001];
 12 void build(int u,int v)
 13 {
 14   num++;
 15   edge[num].next=head[u];
 16   edge[num].to=v;
 17   head[u]=num;
 18 }
 19 void dfs1(int x,int pa)
 20 {int i;
 21   size[x]=1;
 22   dep[x]=dep[pa]+1;
 23   fa[x]=pa;
 24   int maxsize=0;
 25   for (i=head[x];i;i=edge[i].next)
 26     {
 27       int v=edge[i].to;
 28       if (v!=pa)
 29     {
 30       dfs1(v,x);
 31       size[x]+=size[v];
 32       if (size[v]>maxsize)
 33         {
 34           son[x]=v;
 35           maxsize=size[v];
 36         }
 37     }
 38     }
 39 }
 40 void dfs2(int x,int pa,int tp)
 41 {int i;
 42   in[x]=++tot;
 43   top[x]=tp;
 44   if (son[x]) dfs2(son[x],x,tp);
 45   for (i=head[x];i;i=edge[i].next)
 46     {
 47       int v=edge[i].to;
 48       if (v!=pa&&v!=son[x]) dfs2(v,x,v);
 49     }
 50   out[x]=++tot;
 51 }
 52 void add(int x,int d)
 53 {int i;
 54   for (i=x;i<=tot;i+=(i&(-i)))
 55     c[i]+=d;
 56 }
 57 int query(int x)
 58 {int i;
 59   int s=0;
 60   for (i=x;i;i-=(i&(-i)))
 61     s+=c[i];
 62   return s;
 63 }
 64 int LCA(int x,int y)
 65 {
 66   while (top[x]!=top[y])
 67     {
 68       if (dep[top[x]]<dep[top[y]]) swap(x,y);
 69       x=fa[top[x]];
 70     }
 71   if (dep[x]<dep[y]) return x;
 72   else return y;
 73 }
 74 int main()
 75 {int i,u,v,p,q;
 76   char s[101];
 77   cin>>n>>m;
 78   for (i=1;i<=n-1;i++)
 79     {
 80       scanf("%d%d",&u,&v);
 81       build(u,v);
 82       build(v,u);
 83     }
 84   dfs1(1,0);
 85   dfs2(1,0,1);
 86   for (i=1;i<=n;i++)
 87     {
 88       add(in[i],1);
 89       add(out[i],-1);
 90     }
 91   for (i=1;i<=m;i++)
 92     {
 93       scanf("%s",s);
 94       if (s[0]=='Q')
 95     {
 96       scanf("%d%d",&p,&q);
 97       int lca=LCA(p,q);
 98       int t1=dep[p]+dep[q]-2*dep[lca];
 99       int t2=query(in[p])+query(in[q])-2*query(in[lca]);
100       if (t1==t2)
101         printf("Yes\n");
102       else printf("No\n");
103     }
104       else if (s[0]=='C')
105     {
106       scanf("%d%d",&p,&q);
107       if (dep[p]<dep[q]) swap(p,q);
108       Q[++cnt]=p;
109       add(in[p],-1);
110       add(out[p],1);
111     }
112       else if (s[0]=='U')
113     {
114       scanf("%d",&p);
115       p=Q[p];
116       add(in[p],1);
117       add(out[p],-1);
118     }
119     }
120 }

转载于:https://www.cnblogs.com/Y-E-T-I/p/7750994.html

洛谷模拟赛 部落冲突相关推荐

  1. 洛谷模拟赛 数据结构

    题目背景 引言 数据结构学的好,未来工作没烦恼. Edgration 是一个喜欢乱搞数据结构的蒟蒻(以下简称edt),有一天,他作死想去刁难一下dalao: edt想求一种数据结构,使得可以实现区间加 ...

  2. 【LGR-142-Div.4】洛谷入门赛 #13 考后分析与题解

    洛谷入门赛 #Round 13 比赛分析与总结 T1 魔方 题目背景 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 数据规模与约定 分析 AC代码 注意 T2 教学楼 ...

  3. 2020 CCF非专业级别软件能力认证第一轮(LGR-10)洛谷模拟试题试卷

    2020 CCF非专业级别软件能力认证第一轮 (LGR-10)洛谷模拟试题试卷 认证时间:2020年10月8日09:30-11:30 一.单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正 ...

  4. 【2020.11.2 洛谷团队赛 普及组 模拟赛】T2 U138390 三角形

    题目描述 现在工厂里有三根铁棒,分别长为 a , b , c a,b,c a,b,c,现在你可以对其中一些铁棒进行加长,但总的加长长度 不能超过L,问有多少种加长的方案使得加长后的铁棒可以构成三角形. ...

  5. 洛谷 P3396 哈希冲突 解题报告

    P3396 哈希冲突 题目背景 此题约为NOIP提高组Day2T2难度. 题目描述 众所周知,模数的hash会产生冲突.例如,如果模的数p=7,那么4和11便冲突了. B君对hash冲突很感兴趣.他会 ...

  6. 洛谷3396 哈希冲突 【分块】

    题目 众所周知,模数的hash会产生冲突.例如,如果模的数p=7,那么4和11便冲突了. B君对hash冲突很感兴趣.他会给出一个正整数序列value[]. 自然,B君会把这些数据存进hash池.第v ...

  7. 【2020.11.4 洛谷团队赛 普及组】T1 U138644 小Biu的礼物

    题目描述 小BiuBiuBiu送给小PiunPiu nPiun 个礼物,每个礼物的体积为v[i],现在小Piu有m个箱子,每个箱子的体积为k ,去装这 些物品,小PiuPiuPiu会从左到右依次选择每 ...

  8. 洛谷P3845-球赛【离散化,贪心】

    正题 题目连接: https://www.luogu.org/problemnew/show/P3845 AC信息: https://www.luogu.org/record/show?rid=695 ...

  9. 洛谷-P3396 哈希冲突 分块

    题目 题目链接 题意 给你个数列,编号为1-n1-n1-n. 给出两种操作: 查询操作:查询所有编号模xxx得y" role="presentation" style=& ...

最新文章

  1. LuceneLucene简介
  2. java collection api_Java Stream和Collection比较:何时以及如何从Java API返回?
  3. 解决SublimeCodeIntel回车换行误打代码
  4. Redis 优势以及性能问题
  5. Linq快速入门——扩展方法
  6. hbuilderx内置服务器启动失败_Nginx服务器简介与配置
  7. curl实现发送Get和Post请求(PHP)
  8. 电子邮件正则表达式-集结号
  9. teechart for java_TeeChart控件Java版
  10. PPI | protein-protein interaction | 蛋白互作分析 | gene interaction | 基因互作
  11. 自动文本摘要任务背景调研
  12. GSM蜂窝基站定位基本原理浅析
  13. 智遥工作流软件,转下一步时数据保存解析
  14. EMV Level1(7816)学习(Smart Cart智能卡)-2
  15. (转)DEDECMS模板原理、模板标签学习 - .Little Hann
  16. signature=0e936ad5c99bd8d603e71fa74e787bee,JavaScript 的 BASE64 算法 实现 完美解决中文乱码...
  17. Ubuntu 20.04自动挂载NFS失败
  18. 智能车K60学习笔记
  19. 在微信小程序中 调用前置摄像头拍照 后置摄像头拍照扫码
  20. 智能硬件“双雄”:先跑的VR何故被智能音箱反超?

热门文章

  1. Unity3D 集成 Face++ FacePlusPlus httpClient http协议 byte数组转string
  2. java.lang.NoSuchMethodError: javax.persistence.One
  3. 转MFC消息映射梳理
  4. 专利分析与申请(1):法国汤姆森公司关于在有损编码器上扩展无损编码器的专利分析...
  5. 多个旅游网站被挂马 五一假期外出旅游应小心
  6. 简单比较Python的数据持久化操作
  7. 2017河北单招计算机试题,2017河北单招英语试题练习题
  8. 数字IC设计各种仿真波形文件
  9. java8 并行执行方法_如何在Java8中执行此并行任务
  10. 如何添加显示桌面图标置于快速启动栏