Codeforces Round #685 (Div. 2)

CF1451A Subtract or Divide

洛谷传送门
CF1451A


分析

考虑偶数可以直接除以非2的部分剩下2再减1,
奇数可以减1转化为偶数,1和2需要特判


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
signed main(){
	for (rr int T=iut();T;--T,putchar(10)){
		rr int n=iut();
		if (n<4) putchar(47+n);
		    else putchar(50+(n&1));
	}
	return 0;
}

CF1451B Non-Substring Subsequence

洛谷传送门
CF1451B


分析

可以发现只要 ([1,l)) 出现 (s[l])((r,n]) 出现 (s[r]) 一定有解
因为只要有一个位置不同就可以了


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=111; int n,m,s[2][N],a[N],p[2][N];
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
signed main(){
	for (rr int T=iut();T;--T){
		n=iut(),m=iut(),s[0][n+1]=s[1][n+1]=0;
		for (rr int i=1;i<=n;++i) scanf("%1d",&a[i]);
		for (rr int i=1;i<=n;++i){
			p[0][i]=p[0][i-1],p[1][i]=p[1][i-1];
			if (a[i]) p[1][i]=1; else p[0][i]=1;
		}
		for (rr int i=n;i>=1;--i){
			s[0][i]=s[0][i+1],s[1][i]=s[1][i+1];
			if (a[i]) s[1][i]=1; else s[0][i]=1;
		}
		for (rr int i=1;i<=m;++i){
			rr int l=iut(),r=iut();
			puts((p[a[l]][l-1]|s[a[r]][r+1])?"YES":"NO");
		}
	}
	return 0;
}

CF1451C String Equality

洛谷传送门
CF1451C


分析

考虑可以先将字符串 (a) 的字符种类和数量完全相同,再交换。

直接从字母 (a) 开始模拟是否可以将多余的字母改变即可


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=1000011;
int flag,n,k,c1[26],c2[26];
char S1[N],S2[N];
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans; 
}
signed main(){
	for (rr int T=iut();T;--T){
		n=iut(),k=iut(),scanf("%s%s",S1+1,S2+1),flag=0;
		for (rr int i=0;i<26;++i) c1[i]=c2[i]=0;
		for (rr int i=1;i<=n;++i) ++c1[S1[i]-97],++c2[S2[i]-97];
		for (rr int i=0;i<26;++i)
		if (c1[i]<c2[i]) {puts("No"),flag=1; break;}
		    else if (c1[i]>c2[i]){
		    	if ((c1[i]-c2[i])%k) {puts("No"),flag=1; break;}
		    	c1[i+1]+=c1[i]-c2[i];
		}
		if (!flag) puts("Yes");
	}
	return 0;
}

CF1451D Circle Game

洛谷传送门
CF1451D


分析

首先只要把 (d,k) 放缩 就可以转化为半径为 (r) 每次移动一个单位长度
找到直线 (y=x) 上最远的格点,因为先手无论怎么走后手都能移动到该直线上。
如果该格点还能往上或往右走则先手必胜,否则后手必胜。


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#define rr register
using namespace std;
const double gh2=sqrt(2);
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
signed main(){
	for (rr int T=iut();T;--T){
		rr double r=iut()*1.0/iut();
		rr long long mx=r/gh2;
		if (mx*mx+(mx+1)*(mx+1)>r*r) puts("Utkarsh");
		    else puts("Ashish");
	}
	return 0;
}

CF1451E2 Bitwise Queries (Hard Version)

洛谷传送门
CF1451E2


分析

先异或 (n-1) 次这样只要确定一个数就可以确定其它的数。

如果存在两个相同的数,那么直接把这两个数按位与即可。

否则异或值最小的数与单独拎出来的数最多有一个二进制位不同,还是按位与然后取个并集


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=66011; int a[N],n,rk[N],ans[N];
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans; 
}
bool cmp(int x,int y){return a[x]<a[y];}
signed main(){
	n=iut();
	for (rr int i=1;i<n;++i){
		printf("XOR %d %d
",i,n);
		fflush(stdout);
		a[i]=iut(),rk[i]=i;
	}
	sort(rk+1,rk+n,cmp);
	for (rr int i=1;i<n-1;++i)
	if (a[rk[i]]==a[rk[i+1]]){
		printf("AND %d %d
",rk[i],rk[i+1]);
		fflush(stdout);
		ans[rk[i]]=ans[rk[i+1]]=iut();
		ans[n]=a[rk[i]]^ans[rk[i]];
		for (rr int j=1;j<n;++j) ans[rk[j]]=ans[n]^a[rk[j]];
		printf("! ");
		for (rr int j=1;j<=n;++j) printf("%d%c",ans[j],j==n?10:32);
		fflush(stdout); 
		return 0;
	}
	printf("AND %d %d
",rk[1],n),fflush(stdout),ans[n]|=iut();
	printf("AND %d %d
",rk[2],n),fflush(stdout),ans[n]|=iut();
	for (rr int i=1;i<n;++i) ans[rk[i]]=ans[n]^a[rk[i]];
    printf("! ");
	for (rr int i=1;i<=n;++i) printf("%d%c",ans[i],i==n?10:32);
	fflush(stdout);
	return 0;
}

CF1451F Nullify The Matrix

洛谷传送门
CF1451F


分析

考虑必败的状态就是所有位置都为0,记录横纵坐标之和为 (x) 的数的异或值为 (s_x)

如果存在一个位置的 (s_x) 为0,那么可以将状态转换为所有的 (s_x) 均为0,反之亦然。

所以如果所有的 (s_x) 都为0 先手必败,否则先手必胜


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
int n,m,a[211],flag;
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
signed main(){
	for (rr int T=iut();T;--T){
		n=iut(),m=iut(),flag=1;
		for (rr int i=1;i<=n;++i)
		for (rr int j=1;j<=m;++j)
		    a[i+j-1]^=iut();
		for (rr int i=1;i<n+m&&flag;++i)
		    if (a[i]) {puts("Ashish"),flag=0;}
		if (flag) puts("Jeel");
		for (rr int i=1;i<n+m;++i) a[i]=0;
	}
	return 0;
} 
原文地址:https://www.cnblogs.com/Spare-No-Effort/p/15401481.html