哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)G - 幼儿园战争...
题目描述
幼儿园的孩子们正在做游戏,每个人都有自己的帮派,帮派之间打架,然后赢者吞并弱者扩大自己的势力。最开始每个孩子的帮派中只有自己,然后接下来有会有两个人打架,这两个人会集结自己所属的势力开始打架,打赢的一方就会吞并输的一方,当然如果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) query2) fight x y3) tempt x y4) revolt x1<=T<=10;1<=N,M<=100000;1<=x,y<=N;
输出描述:
第一行输出"Case #x:",表示第x组测试数据。接下来输出查询结果,每个结果占一行。
输入
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
题解
并查集。
带有删除操作,和之前做过一个题一样,忘记是哪题了,要删除某个节点,在原集合中那个点就不管了,再开一个新节点就可以。
#include <bits/stdc++.h>
using namespace std;const int maxn = 5e5 + 10;
int f[maxn];
int b[maxn];
int c[maxn];
int T, n, m;
int block;
char op[20];int Find(int x) {if(x != f[x]) return f[x] = Find(f[x]);return f[x];
}int main() {scanf("%d", &T);for(int cas = 1; cas <= T; cas ++) {printf("Case #%d:\n", cas);scanf("%d%d", &n, &m);for(int i = 1; i <= 500000; i ++) {f[i] = i;c[i] = 1;b[i] = i;}block = n;while(m --) {scanf("%s", op);int x, y, fx, fy;if(op[0] == 'q') {printf("%d\n", block);} else if(op[0] == 'f') {scanf("%d%d", &x, &y);fx = Find(b[x]);fy = Find(b[y]);if(fx == fy) continue;if(c[fx] == c[fy]) {printf("Either is winner!\n");continue;} else if(c[fx] > c[fy]) {c[fx] = c[fx] + c[fy];f[fy] = fx;block --;printf("%d is winner!\n", x);} else {c[fy] = c[fy] + c[fx];f[fx] = fy;block --;printf("%d is winner!\n", y);}} else if(op[0] == 't') {scanf("%d%d", &x, &y);fx = Find(b[x]);fy = Find(b[y]);if(fx == fy) continue;c[fy] --;if(c[fy] == 0) block --;n ++;b[y] = n;fx = Find(b[x]);fy = Find(b[y]);f[fy] = fx;c[fx] = c[fx] + c[fy];} else {scanf("%d", &x);fx = Find(b[x]);c[fx] --;if(c[fx] == 0) block --;n ++;b[x] = n;block ++;}}}return 0;
}
转载于:https://www.cnblogs.com/zufezzt/p/8065068.html
哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)G - 幼儿园战争...相关推荐
- 哈尔滨理工大学第七届程序设计竞赛决赛(现场赛-高年级组)B-幸运大奖
链接: https://www.nowcoder.com/acm/contest/50/B 来源:牛客网 题目描述 tabris实在是太穷了,为了发财,tabris去买了一张彩票,幸运地中了特别奖. ...
- 哈尔滨理工大学第七届程序设计竞赛初赛 题集
1. 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 这是mengxiang000和Tabri ...
- 哈尔滨理工大学第七届程序设计竞赛初赛(低年级组)
水题就不做讲解了~~~~~: A 蓝廋.香菇 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 ...
- 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)题解
比赛链接:https://www.nowcoder.com/acm/contest/27#question A: 小Z的体型实在是太胖了,每次和小D一起出门都跟不上小D的脚步,这让小Z很气馁,于是小Z ...
- 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)F 苦逼的单身狗【DP】
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 双11又到了,小Z依然只是一只单身狗,对此他是 ...
- 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)F - 苦逼的单身狗
题目描述 双11又到了,小Z依然只是一只单身狗,对此他是如此的苦恼又无可奈何. 为了在这一天脱单小Z决定向女神表白,但性格腼腆的小Z决定隐晦一点,截取一段包含'L'.'O'.'V'.'E'的英文.(顺 ...
- 【哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)】 A B C D F G H I
A 凌波微步 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 小Z的体型实在是太胖了,每次和小 ...
- 哈尔滨理工大学第12届程序设计竞赛--ADK题
A割韭菜--线段树 题目链接: A-割韭菜_哈尔滨理工大学第12届程序设计竞赛(同步赛) (nowcoder.com) #include <bits/stdc++.h>using name ...
- 科林明伦杯”哈尔滨理工大学第十届程序设计竞赛B(减成1)
科林明伦杯"哈尔滨理工大学第十届程序设计竞赛 存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一.问最少多少次操作,可以让所有数都变成1. 数据保证一定有解. 输入描述: 输入t, ...
最新文章
- 未来,中国空间站将成为怎样的“太空科研站”?
- Linux 常用命令操作
- Socket,非阻塞,fcntl
- oracle分组_MySQL分组取TOP,实现Oracle的ROW_NUMBER函数的功能
- C# 窗口全屏 隐藏任务栏 (代码)
- iredmail邮件服务器之修改默认的web服务端口号
- 获得字典中的最后一个元素python_Python从入门到熟练(5): 数据类型进阶
- sklearn knn 算法
- 创造新世界--全国模拟(二)
- 超级经典的与其他语言混合编程的批处理代码
- ## STAMP使用中数据上传注意事项
- 可微分神经计算机DNC
- joomla 视频_Joomla的成年
- vue+ElementUI实现订单页动态添加产品效果
- 人类基因编辑技术及背后的伦理问题 【个人观点,仅供参考】
- 水安ABC考试多选练习题库
- 基于RSA和AES混合加密实现的加解密小工具
- python怎么统计多少字符_python统计中文字符数量的两种方法
- 将软键盘的回车按钮变为搜索按钮
- linux so_linger,linux系统编程之getsockopt/setsockopt 函数