Codeforces Round #736 (Div. 2)


A. Gregor and Cryptography

https://codeforces.com/contest/1549/problem/A

题目A的含义是给你t组数据,每组含有一个素数,针对每组输出两个数,令原数模去这两个输出的数结果相等,这道签到题解法多.

我的解法如下:

#include<iostream>
using namespace std;
int main()
{
	int t,p;
	cin>>t;
	while(t--)
	{
		cin>>p;
		if(p==5)cout<<"2 4"<<endl;
		else{
			cout<<"2 "<<p/2<<endl;
		}
	}
	return 0;
}

还有一种就是每次输出2和原素数p-1,这样无论哪种情况取模的结果都是1.


B. Gregor and the Pawn Game

https://codeforces.com/contest/1549/problem/B

题目大意是有两行棋子,1表示有棋子,0表示没有,我们要将棋子从下往上走,如果棋子的上方没有棋子,就直接往上一格,如果上方有棋子,那么就将它往左前或者往右前移动,此时它可以把这两个位置上的棋子吃掉.最后输出棋子排列情况.

这个题就直接暴力模拟即可.但是要注意向左向右的时候防止越界.

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int t,len,sum,vis[200007];
	string str1,str;
	cin>>t;
	while(t--)
	{
		sum=0;
		cin>>len;
		for(int i=0;i<len;i++)vis[i]=0;
		cin>>str>>str1;
		for(int i=0;i<len;i++)
		{
			if(str1[i]=='1')
			{
				if(str[i]=='0'&&vis[i]==0)
				{
					sum++;
					vis[i]=1;
				}
				else if(str[i]=='1')
				{
					if(vis[i-1]==0&&i-1>=0&&str[i-1]=='1')
					{
						vis[i-1]=1;
						sum++;
					}
					else if(vis[i+1]==0&&i+1<len&&str[i+1]=='1')
					{
						vis[i+1]=1;
						sum++;
					}
				}
			}
		}
		cout<<sum<<endl;
	}
}

C. Web of Lies

https://codeforces.com/contest/1549/problem/C

该题大意:

题意:输入n,m.n代表有多少贵族(1~n)每个贵族都有一个权力值,m表示含有多少段关系.每段关系的端点两个人编号是u,v.接下来有q个操作,每次操作输入一个数t,如果t为1则增加一段关系,为2 则是删除一段关系,为3是模拟满足以下2个条件的人将死去,1.至少有1个盆友.2.每个朋友的权力值都比他大.3则是输出模拟了无数轮后仍然存活的人数.


该题其实不是太难,一开始我还想着把图全部建完然后进行处理,其实没有必要,按照题目意思,每段连着的关系,都只能存活一个人,那么每次输入关系的时候,把那个权力值更小的人杀掉即可,这是我们就把用于记录存活人数的ans减少一个人,要注意,看图可知,如果死去的那个人是某两段关系的交点,那么这两段关系就不会有联系,那么我们就用一个fri数组记录死去人的情况,如果下次在遇见处理他的情况,因为他的fri[i]!=0,表明他不只有一个朋友,并且已经被朋友杀害,这样下一段输入进来的包含这个死人的关系中,如果另外一个人权力值大于这个死人,那么因为fri数组已经标记了死者,那么ans不会有影响,如果这个人权力值小于死人,那么他仍然按正常情况会被杀死.输入关系都这样处理即可.但如果是删除关系,只需要把这个操作倒着来一次就行,取消标记,把人复活,ans++回来.

#include<iostream>
using namespace std;
int fri[200007];
int main()
{
	int t,u,v,n,m,q,ans;
	cin>>n>>m;
	ans=n;
	for(int i=0;i<m;i++)
	{
		cin>>u>>v;
		if(u>v)
		{
			if(fri[v]==0)
			{
				ans--;
			}
			fri[v]++;
		}
		else
		{
			if(fri[u]==0)
			{
				ans--;
			}
			fri[u]++;
		}
	}
	cin>>q;
	for(int i=0;i<q;i++)
	{
		cin>>t;
		if(t==1)
		{
			cin>>u>>v;
			if(u>v)
			{
				if(fri[v]==0)
				{
					ans--;
				}
				fri[v]++;
			}
			else
			{
				if(fri[u]==0)
				{
					ans--;
					}
				fri[u]++;
			}
		}
		else if(t==2)
		{
			cin>>u>>v;
			if(u>v)
			{
				fri[v]--;
				if(fri[v]==0)
				{
					ans++;
				}
				
			}
			else
			{
				fri[u]--;
				if(fri[u]==0)
				{
					ans++;
				}
			}
		}
		else
		{
			cout<<ans<<endl;
		}
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值