1. 程式人生 > 其它 >如何自動生成測試報告?

如何自動生成測試報告?

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\n",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\n",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\n",rk[1],n),fflush(stdout),ans[n]|=iut();
	printf("AND %d %d\n",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;
}