哈尔滨理工大学第七届程序设计竞赛决赛(现场赛-高年级组)G-幼儿园战争

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更效! 阅读详情
链接: https://www.nowcoder.com/acm/contest/50/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) query
2) fight x y
3) tempt x y
4) revolt x
1<=T<=10;
1<=N,M<=100000;
1<=x,y<=N;

#include<bits/stdc++.h>
using namespace std;
const int maxn=200007;
int par[maxn],ran[maxn],id[maxn],ans;
void init()
{
    for(int i=0;i<maxn;i++)
        par[i]=i,ran[i]=1,id[i]=i;
}
int find(int x)
{
    if(x==par[x])return x;
    return par[x]=find(par[x]);
}
void unite(int x,int y)
{
    x=find(x);y=find(y);
    if(x!=y)
    {
        par[x]=y;
        ran[y]+=ran[x];
        ran[x]=0;
    }
}
int main()
{
    int T,cas=0;scanf("%d",&T);
    while(T--)
    {
        printf("Case #%d:\n",++cas);
        int n,m,cnt;scanf("%d%d",&n,&m);
        init();
        cnt=ans=n;
        cnt++;
        while(m--)
        {
            char t[10];int x,y;
            scanf("%s",&t);
            if(t[0]=='q') printf("%d\n",ans);
            else if(t[0]=='f')
            {
                int x,y;scanf("%d%d",&x,&y);
                int x1=find(id[x]),y1=find(id[y]);
                if(x1==y1)continue;
                if(ran[x1]>ran[y1])
                {
                    printf("%d is winner!\n",x);
                    unite(x1,y1);
                    ans--;
                }
                else if(ran[x1]<ran[y1])
                {
                    printf("%d is winner!\n",y);
                    unite(x1,y1);
                    ans--;
                }
                else printf("Either is winner!\n");
            }
            else if(t[0]=='t')
            {
                int x,y;scanf("%d%d",&x,&y);
                x=find(id[x]);
                int y1=find(id[y]);
                if(ran[y1]==1)ans--;
                ran[y1]--;
                id[y]=cnt++;
                unite(x,id[y]);
            }
            else if(t[0]=='r')
            {
                int x;scanf("%d",&x);
                int x1=find(id[x]);
                if(ran[x1]>1)id[x]=cnt++,ran[x1]--,ans++;
            }
        }
    } 
    return 0;
}

【 newcoder 】幼儿园战争 【并查集+删并查】 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 幼儿园的孩子们正在做游戏,每个人都有自己的帮派,帮派之间打架,然后赢者吞并弱者扩大自己的势力。最开始每个孩子的帮派中只有自己,然后接下来有会有两个人打架,这两个人会集结自己所属的势力开始打架,打赢的一方就会吞并输的一方,当然如果x,y是一个 阅读详情

相关推荐

求最大值

题目描述 给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)【1<=i<j<=n】的最大值。 操作次数有Q次,每次操作需要将位子p处的数字变成y. 输入描述: 本题包含多组输入,每组输入第一行一个数字n,表示序列的长度。 然后接下来一行输入n个数,表示原先序列的样子。 再接下来一行一个数字Q,表示需要进行的操作的次数。 最后Q行每行两个元素p,y,表...

青烟绕指柔的博客 756

哈尔滨理工大学第七届程序设计竞赛决赛(网络-年级组)G.幼儿园战争

题目描述幼儿园的孩子们正在做游戏,每个人都有自己的帮派,帮派之间打架,然后赢者吞并弱者扩大自己的势力。最开始每个孩子的帮派中只有自己,然后接下来有会有两个人打架,这两个人会集结自己所属的势力开始打架,打赢的一方就会吞并输的一方,当然如果x,y是一个势力就不会打起来。有些聪明的小朋友会将自己的糖分给其他小朋友引诱他离开所属势力加入到自己势力。又有一些小朋友会对现在的势力不满,然后反叛出去自立门户。作...

keep coding 581

牛客-求最大值(单点修改,区间查询)

题目直通车 给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)【1<=i<j<=n】的最大值。 操作次数有Q次,每次操作需要将位子p处的数字变成y. 输入描述: 本题包含多组输入,每组输入第一行一个数字n,表示序列的长度。 然后接下来一行输入n个数,表示原先序列的样子。 再接下来一行一个数字Q,表示需要进行的操作的次数。 最后Q行每行两个元素p,y,...

jahup的博客 1036

幼儿园战争

题目描述幼儿园的孩子们正在做游戏,每个人都有自己的帮派,帮派之间打架,然后赢者吞并弱者扩大自己的势力。最开始每个孩子的帮派中只有自己,然后接下来有会有两个人打架,这两个人会集结自己所属的势力开始打架,打赢的一方就会吞并输的一方,当然如果x,y是一个势力就不会打起来。有些聪明的小朋友会将自己的糖分给其他小朋友引诱他离开所属势力加入到自己势力。又有一些小朋友会对现在的势力不满,然后反叛出去自立门户。作...

ó 535

哈尔滨理工大学第七届程序设计竞赛决赛(网络-年级组)(重现

A #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; const ll mod=1e9+7; /*ll quick_mul(ll x,ll y) { ll ans=0; while(y){ if(y&1)ans=(ans+x)%mod

fusu123456789的博客 202

哈尔滨理工大学第七届程序设计竞赛决赛(网络-年级组)G - 幼儿园战争...

题目描述 幼儿园的孩子们正在做游戏,每个人都有自己的帮派,帮派之间打架,然后赢者吞并弱者扩大自己的势力。最开始每个孩子的帮派中只有自己,然后接下来有会有两个人打架,这两个人会集结自己所属的势力开始打架,打赢的一方就会吞并输的一方,当然如果x,y是一个势力就不会打起来。有些聪明的小朋友会将自己的糖分给其他小朋友引诱他离开所属势力加入到自己势力。又有一些小朋友会对现在的势力不满,然后反叛出去...

weixin_34198797的博客 170

哈尔滨理工大学第七届程序设计竞赛决赛(现场-年级组) A-所有情况的和

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 在acimo星球, tabris 是一名勇敢的屠龙勇士,在上绿岛屠龙前决定挑选N种装备武装自己,现在每种装备有两个,**但每种装备tabris必须选择拿一个**,**不能多也不能少**。 每件装备有自己的属性值,能给tabris

不忘初心,知行统一 389

哈尔滨理工大学第七届程序设计竞赛决赛(网络-年级组)A 所有情况的和(思维题)

题目描述在acimo星球, tabris 是一名勇敢的屠龙勇士,在上绿岛屠龙前决定挑选N种装备武装自己,现在每种装备有两个,**但每种装备tabris必须选择拿一个**,**不能多也不能少**。每件装备有自己的属性值,能给tabris属性加成。对于不同种类的装备之间有叠加效果,如果选择多件装备,最终的属性加成为他们的乘积。若tabris初始属性值为0,最后属性加成的期望是多少。输入描述:有多组测试...

keep coding 417

第七届湘计算机程序设计竞赛的学生 报道称,数字游戏

报数游戏 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述     n 个人站成一行玩一个报数游戏。全部人从左到右编号为 1 到 n。游戏開始时,最左边的人报 1。他右边的人报 2,编号为 3 的人报 3,等等。当编号为 n 的人(即最右边的人)报完 n 之后,轮到他左边的人(即编号为n-1 的人)报 n+1,然后编号为 ...

weixin_33953249的博客 202

离开幼稚园

年轻人不要试图最求安全感,特别是年轻的时候,周遭环境从来都不会有绝对的安全感,如果你觉得安全了,很有可能开始暗藏着危机。真正的安全感,来自你对自己的信心,是你每个阶段性的目标的实现,而真正的归属感,在于你内心深处,对自己命运的把控,因为你对强大的对手永远是自己。 ——李嘉诚 踏入社会,我被时间推向远方,离开幼稚园,走向那朦胧的理想 安全感,过去的三年甚至更久,我一直被它所牵绊着。李嘉

Garfier的专栏 956

哈尔滨理工大学第七届程序设计竞赛决赛(网络-年级组

哈尔滨理工大学第七届程序设计竞赛决赛(网络-年级组) A 所有情况的和 题目链接: https://www.nowcoder.com/acm/contest/30/A 思路: 可以总结出公式: \[ sum = \prod\limits_{i = 1}^n {(a_i + b_i)} \] 代码: #include <bits/stdc++.h> using na...

ddqb3235的博客 246

哈尔滨理工大学第七届程序设计竞赛决赛(网络-年级组)(题补)

J: 思路:根据广搜的代码想出遍历每种情况(经过一定筛选)的暴力解法 代码:

←_← 1073

牛客网 求最大值( 思维 )

题目链接 题意 :给出一个序列,你的任务是求每次操作之后序列中(a[j]-a[i])/(j-i)【1<=i<j<=n】的最大值。操作次数有Q次,每次操作需要将位子p处的数字变成y. 分析 : 最大值实际上只要考虑相邻的 i 和 j 就行了,即相邻的a[]数组元素,此时式子的分母永远是 1 ,为什么?简单地看看这个式子 ( a[j] - a[i] ) / ( j - ...

weixin_30511039的博客 265

哈尔滨理工大学第七届程序设计竞赛决赛 题解

链接:https://www.nowcoder.com/acm/contest/30#question A: 在acimo星球, tabris 是一名勇敢的屠龙勇士,在上绿岛屠龙前决定挑选N种装备武装自己,现在每种装备有两个,**但每种装备tabris必须选择拿一个**,**不能多也不能少**。 每件装备有自己的属性值,能给tabris属性加成。 对于不同种类的装备之间有叠加效

I good vegetable a! 908

牛客 14402 求最大值

牛客 14402 求最大值 题目链接 题目描述 给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)【1<=i<j<=n】的最大值。 操作次数有Q次,每次操作需要将位子p处的数字变成y. 输入描述: 本题包含多组输入,每组输入第一行一个数字n,表示序列的长度。 然后接下来一行输入n个数,表示原先序列的样子。 再接下来一行一个数字Q,表示需要进行的操作的次数。 最后Q行每行两个元素p,y,表示本操作需要将位子p处的数字变成y. 数据范围: 3<=n<=

旺崽的博客 2643

哈尔滨理工大学第七届程序设计竞赛年级组)G(BFS)

题目链接:https://www.nowcoder.com/acm/contest/27/G 思路:预处理S点和*点,按顺序push进队列,然后BFS,判断对头是否有火,若有则扩展火的移动,若无则扩展人的移动。这里建一个huo[][]数组来存储每个点火的状态,如果已经是1了就不能再进队列了! #include&lt;bits/stdc++.h&gt; using namespace std;...

swineherd的博客 389

不过的小东东

tabris实在是太穷了,为了发财,tabris去买了一张彩票,幸运地中了特别奖。 特别奖是这样的,不会直接给你发钱.会给你一串二进制数s,让你在s中选择一个不大于k的区间,这个区间表示的数就是获奖者的奖金数目. tabris中奖之后已经激动地蒙圈了,他不知道如何选择能获得最多的钱,你能帮帮他不? 输入描述: 输入一个整数T(T≤10),代表有T组数据. 每组数据占两行...

weixin_33862041的博客 218
上一篇: 哈尔滨理工大学第七届程序设计竞赛决赛(现场赛-高年级组)E-求最大值
下一篇: HDU 1269 迷宫城堡(tarjan算法)
还是太年轻
博客等级 码龄9年 53粉丝 552原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值