哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)G.幼儿园战争
2017-12-10 18:53
232 查看
题目描述
幼儿园的孩子们正在做游戏,每个人都有自己的帮派,帮派之间打架,然后赢者吞并弱者扩大自己的势力。最开始每个孩子的帮派中只有自己,然后接下来有会有两个人打架,这两个人会集结自己所属的势力开始打架,打赢的一方就会吞并输的一方,当然如果x,y是一个势力就不会打起来。有些聪明的小朋友会将自己的糖分给其他小朋友引诱他离开所属势力加入到自己势力。又有一些小朋友会对现在的势力不满,然后反叛出去自立门户。作为打架的双方,只有人数大于另一方才能打赢。即:人数相等则没有输赢,两个帮派没有变化。
幼儿园里面共有N个孩子,接下来有M次操作,操作有如下4种
1) query 查询现在有多少个势力。
2) fight x y 表示x,y打架.并输出"z is winner!"胜利的一方(z是x或y),如果没有打平则输出"Either is winner!".如果x,y属于同一个势力不会打架,当然也不用输出.
3) tempt x y 表示x诱惑y、将y拉入x的势力。
4) revolt x 表示x反叛,(自立门户)
输入描述:
第一行输入一个T代表有T组数据 接下来第一行有两个整数N,M,代表N个孩子,M次操作。 接下来有M行。每行输入有如下三种。 1) query 2) fight x y 3) tempt x y 4) revolt x 1<=T<=10; 1<=N,M<=100000; 1<=x,y<=N;
输出描述:
第一行输出"Case #x:",表示第x组测试数据。 接下来输出查询结果,每个结果占一行。示例1
输入
1 5 9 query tempt 1 2 query fight 4 5 query fight 2 3 query revolt 2 query
输出
Case #1: 5 4 Either is winner! 4 2 is winner! 3 4队友写的并查集超时 我用set水一波过了哈哈哈
#include <bits/stdc++.h>
using namespace std;
set<int> is[100005];
int location[100005];
int main() {
int t,n,m,kase=1;
cin>>t;
while(t--){
printf("Case #%d:\n",kase++);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) { is[i].insert(i); location[i]=i;}
int fp=n;
int num=n;
while(m--){
char s[10];
scanf("%s",s);
if(s[0]=='q'){
cout<<num<<endl;
}
else if(s[0]=='f'){
int x,y;
scanf("%d%d",&x,&y);
int xa=x;
int ya=y;
x=location[x];
y=location[y];
if(x==y) continue;
if(is[x].size()>is[y].size()){
set<int>::iterator ite1 = is[y].begin();
for(;ite1!=is[y].end();ite1++){
int g = *ite1;
location[g]=x;
is[x].insert(g);
}
is[y].clear();
cout<<xa<<" is winner!"<<endl;
num--;
}
else if(is[x].size()<is[y].size()){
set<int>::iterator ite2 = is[x].begin();
for(;ite2!=is[x].end();ite2++){
int g1 = *ite2;
location[g1]=y;
is[y].insert(g1);
}
is[x].clear();
cout<<ya<<" is winner!"<<endl;
num--;
}
else{
cout<<"Either is winner!"<<endl;
}
}
else if(s[0]=='t'){
int x,y;
scanf("%d%d",&x,&y);
int xl = location[x];
is[xl].insert(y);
int yl = location[y];
is[yl].erase(y);
location[y]=xl;
if(is[yl].empty())
num--;
}
else{
int x;
scanf("%d",&x);
int xl = location[x];
if(is[xl].size()==1) continue;
while(!is[fp].empty()) fp++;
is[fp].insert(x);
is[xl].erase(x);
location[x]=fp;
num++;
}
}
for(int i=1;i<=fp;i++) is[i].clear();
memset(location,0,sizeof(location));
}
}
相关文章推荐
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)G - 幼儿园战争
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)A 所有情况的和【期望】
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)B题幸运大奖
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)B 幸运大奖【DP】
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)- (A,B)
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)A_所有情况的和
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)D 数圈圈【DFS||数位DP】
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)-D:数圈圈(数位DP)
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)B - 幸运大奖
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)-E:求最大值(思维)
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)A - 所有情况的和
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)I - 没有名字
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)D - 数圈圈
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)C - 小明打联盟
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)B题幸运大奖
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)-C:小明打联盟(DP+思维)
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)E - 求最大值
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)H - 字典序最小的中序遍历
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)A 所有情况的和(思维题)