部落冲突

news/2025/2/12 15:19:21/

题目背景

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

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

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

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

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

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

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

题目描述

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

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

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

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

输入输出格式

输入格式:

第一行两个数 nnnmmmnnn 代表了一共有 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


树状数组维护树上差分,维护每个点到根节点之间战争的个数。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int MAXN=300005;
int n,m;
struct Edge{
    int v,next;
}e[MAXN];
int tot,head[MAXN],war[MAXN];
int son[MAXN],size[MAXN],dep[MAXN],fa[MAXN],top[MAXN],newid;
int pin[MAXN],pout[MAXN];
int tree[MAXN<<1];
inline void add(int x,int d)
{
    int i;
    for(i=x;i<=n;i+=(i&(-i))){
        tree[i]+=d;
    }
}
inline int query(int x)
{
    int i,res=0;
    for(i=x;i;i-=(i&(-i))){
        res+=tree[i];
    }
    return res;
}
inline void Add(int u,int v)
{
    e[tot].v=v;
    e[tot].next=head[u];
    head[u]=tot++;
}
inline void dfs1(int u)
{
    int i;
    son[u]=0;
    size[u]=1;
    for(i=head[u];~i;i=e[i].next){
        int v=e[i].v;
        if(v==fa[u]) continue;
        fa[v]=u;
        dep[v]=dep[u]+1;
        dfs1(v);
        if(size[v]>size[son[u]]) son[u]=v;
        size[u]+=size[v];
    }
}
inline void dfs2(int u,int anc)
{
    int i;
    top[u]=anc;
    pin[u]=++newid;
    if(!son[u]){
        pout[u]=newid;
        return;
    }
    dfs2(son[u],anc);
    for(i=head[u];~i;i=e[i].next){
        int v=e[i].v;
        if(v==fa[u]||v==son[u]) continue;
        dfs2(v,v);
    }
    pout[u]=newid;
}
inline int lca(int x,int y)
{
    while(top[x]!=top[y]){
        if(dep[top[x]]<dep[top[y]]) swap(x,y);
        x=fa[top[x]];
    }
    return dep[x]<dep[y]?x:y;
}
int main()
{
    ios::sync_with_stdio(false);
    memset(head,-1,sizeof(head));
    int i,j,u,v,root=1,num=0;
    string flag;
    cin>>n>>m;
    f(i,1,n-1){
        cin>>u>>v;
        Add(u,v);
        Add(v,u);
    }
    dfs1(root);
    dfs2(root,root);
    f(i,1,n){
//        cout<<pin[i]<<' '<<pout[i]<<endl;
        add(pin[i],1);
        add(pout[i]+1,-1);
    }
    while(m--){
        cin>>flag;
        if(flag=="Q"){
            cin>>u>>v;
            int l=lca(u,v);
            int dis1=dep[u]+dep[v]-2*dep[l];
            int dis2=query(pin[u])+query(pin[v])-2*query(pin[l]);
            if(dis1==dis2) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }
        else if(flag=="C"){
            cin>>u>>v;
            if(dep[u]<dep[v]) swap(u,v);
            war[++num]=u;
            add(pin[u],-1);
            add(pout[u]+1,1);
        }
        else{
            cin>>u;
            u=war[u];
            add(pin[u],1);
            add(pout[u]+1,-1);
        }
    }
    return 0;
}


http://www.ppmy.cn/news/388612.html

相关文章

android qq隐藏功能,90﹪的人都不知道--手机QQ这些隐藏的功能!

90&#xfe6a;的人都不知道--手机QQ这些隐藏的功能&#xff01; 我们在平时玩手机的时候&#xff0c;最常用到微信&#xff0c;当然QQ也算是我们日常生活中使用频率最多的社交工具之一&#xff0c;它于1999年推出&#xff0c;随着不断的更新迭代&#xff0c;如今的QQ功能可以说…

QQ兴趣部落引流用什么产品好?QQ在社交领域已经积累了不少的商业脉络

QQ兴趣部落引流用什么产品好&#xff1f;QQ在社交领域已经积累了不少的商业脉络 在微信出现之前&#xff0c;社交工具打开率最高的就是QQ。虽然QQ现在的热度比不上微信&#xff0c;但是QQ在社交领域已经积累了不少的商业脉络&#xff0c;非常适合开展引流营销活动。 在QQ有一…

android QQ动态tab,变化忒大了!Android版手机QQ 5.0体验

变化忒大了&#xff01;Android版手机QQ 5.0体验 出处&#xff1a;快科技 2014-07-28 12:02:56 作者&#xff1a;随心 编辑&#xff1a;随心[爆料] 收藏文章 内容导航&#xff1a; 第[01]页&#xff1a;[Android版手机QQ 5.0&#xff1a;界面大变]第[02]页&#xff1a;[And…

android qq隐藏功能,90﹪的人都不知道QQ这些隐藏的功能!

虽然老有人吐槽&#xff0c;腾讯的QQ是抄袭了MSN。但是不管它是不是抄袭&#xff0c;QQ绝对是所有社交软件中普及最广的一款。想当年&#xff0c;在QQ上能够所有不认识的人天南地北的聊的特别开心。那时候还没有手机QQ&#xff0c;为了和某个网友聊天大半夜的去网吧。想想也是醉…

QQ兴趣部落 大批量引流实战技巧

兴趣部落&#xff0c;犹如pc端贴吧&#xff0c;除去盔甲&#xff0c;几乎大同小异。 在文章《QQ运动&#xff0c;新楛的马桶还在香&#xff0c;营销人不应摒弃》中&#xff0c;阿力推推对稍微僻静的平台做过简述&#xff0c;和QQ运动一样&#xff0c;兴趣部落稍显“僻静”&…

java使用qq群发邮件_java群发发送qq邮件

java是常用的编程语言之一&#xff0c;我们可以利用java来做很多事情&#xff0c;甚至可以用于邮件群发&#xff0c;今天一米软件就来教教大家java群发发送qq邮件怎么做。 1、开启SMTP服务 在 QQ 邮箱里的 设置->账户里开启 SMTP 服务 注意开启完之后&#xff0c;QQ 邮箱会生…

qq群管机器人php,常用几款QQ群管机器人软件功能和体验对比

由于考虑到QQ群信息规范且并不能确保24小时在线管理,老蒋一般会将QQ群禁言。但是有些时候确实也需要开放提供网友交流,这里如何对群进行管理和监控呢?考虑到不少网友在使用的 之前老蒋也有在文章中记录到酷Q机器人的一些信息,其中包括Air和Pro两个版本。前者是免费版本,后…

部落

7-3 部落 (25 分) 在一个社区里&#xff0c;每个人都有自己的小圈子&#xff0c;还可能同时属于很多不同的朋友圈。我们认为朋友的朋友都算在一个部落里&#xff0c;于是要请你统计一下&#xff0c;在一个给定社区中&#xff0c;到底有多少个互不相交的部落&#xff1f;并且检…