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;
}