A. Gregor and Cryptography
题目大意:
给出一个数p,找出两个数a,b,满足p%a = p%b
思路:
确定一个数,再去求另一个数
比如说确定a是2,那么b就是p-p%2
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
printf("2 %d\n",n-n%2);
}
}
B. Gregor and the Pawn Game
题目大意:
你有n个棋子位于棋盘下端,棋子只能向前,除非碰到敌人,可以考虑跳到斜对角的敌人那将其吃掉
问有多少个棋子可以到达第一排
思路:
优先考虑斜对角,再考虑直线
注意只有前面有敌人时才能斜着跳 (比赛时因为没看到这个WA了好多次QWQ)
而且不能跳队友身上,加个标记就好
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+3;
char a[maxn],b[maxn];
bool flag[maxn];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d\n",&n);
for(int i=1;i<=n;++i){
scanf("%c",&a[i]);
flag[i]=0;
}
getchar();
for(int i=1;i<=n;++i){
scanf("%c",&b[i]);
}
int ans=0;
for(int i=1;i<=n;++i){
if(b[i]=='0')continue;
if(a[i]=='1'&&!flag[i-1]&&a[i-1]=='1'&&i-1>=1){
ans++;
flag[i-1]=1;
continue;
}
if(a[i]=='1'&&!flag[i+1]&&a[i+1]=='1'&&i+1<=n){
ans++;
flag[i+1]=1;
continue;
}
if(a[i]=='0'){
ans++;
flag[i]=1;
continue;
}
}
printf("%d\n",ans);
}
}
C. Web of Lies
题目大意:
一个人的所有朋友的力量都比他大则他会被杀死
一个人的力量就是他的编号
开局给出一个朋友关系网
后来进行若干操作
1 x y 将x,y变成朋友(保证原本不是朋友)
2 x y 把x,y的朋友关系接触(保证已经是朋友)
3 询问最后会剩下多少人
注:每次询问前,所有人都存活
思路:
不难发现如果一个人的朋友中有比他大的,那他一定会被杀死
所以我们只要找每个人旁边是否有比他大的朋友就好
维护入度就好了
每次添加时给小的人入度加一(多了个比他大的人)
删除直接入度减一即可
(比赛时为啥我要去存比他大的人呢QWQ,搞得TLE了2次)
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+3;
int p[maxn];
void swab(int &a,int &b){a^=b^=a^=b;}
int du[maxn];
int main(){
int n,m;
scanf("%d %d",&n,&m);
int sum=n;
for(int i=1;i<=n;++i)p[i]=1;
for(int i=1;i<=m;++i){
int x,y;
scanf("%d %d",&x,&y);
if(x>y)swab(x,y);
if(du[x]==0)sum--;
du[x]++;
}
int T;
scanf("%d",&T);
while(T--){
int opt;
scanf("%d",&opt);
if(opt==1){
int x,y;
scanf("%d %d",&x,&y);
if(x>y)swab(x,y);
if(du[x]==0)sum--;
du[x]++;
}
if(opt==2){
int x,y;
scanf("%d %d",&x,&y);
if(x>y)swab(x,y);
du[x]--;
if(du[x]==0)sum++;
}
if(opt==3)printf("%d\n",sum);
}
}
题外话:头一次带病打CF,状态果然会降低不少,好多低级错误QWQ
,希望早点好