CF1451A Subtract or Divide
分析
考虑偶数可以直接除以非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
分析
可以发现只要 ([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
分析
考虑可以先将字符串 (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
分析
首先只要把 (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)
分析
先异或 (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
分析
考虑必败的状态就是所有位置都为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;
}