Codeforces Round 1012 (Div. 2)
A. Treasure Hunt
mod(x+y)下,如果是在前一半就是A挖的,否则就是B
B. Pushing Balls
某个球可能从某一行或某一列推过来,
给每一行每一列从头哪些位置是能推到的,也就是说从头开始连续的1,置为1
#include<iostream>
using namespace std;
int a[100][100];
int b[100][100];
int n,m;
int main(){
int T;cin>>T;
while(T--){
cin>>n>>m;
for(int i=1;i<=n;i++){
string str;cin>>str;
for(int j=1;j<=m;j++){
a[i][j]=str[j-1]-'0';b[i][j]=0;
}
}
for(int i=1;i<=n;i++){
int j=1;
while(j<=m&&a[i][j]!=0){b[i][j]=1;j++;}
}
for(int j=1;j<=m;j++){
int i=1;
while(i<=n&&a[i][j]!=0){b[i][j]=1;i++;}
}
bool f=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1&&b[i][j]==0){
f=0;break;
}
}
if(!f)break;
}
if(f)printf("YES\n");
else printf("NO\n");
}
}
C. Dining Hall
用set模拟,容易t的是最开始放多少个进去,

现在看的x都是(x,y)桌子的坐标,只要放s<=sqrt(2*n)就可以
把每个桌子四个点放进去
#include<iostream>
using namespace std;
#include<cstring>
#include<set>
#include<cmath>
int n;
set<pair<int,pair<int,int>>> sss0,sss1;
int main(){
int T;cin>>T;
while(T--){
cin>>n;
sss0.clear();sss1.clear();
for(int s=0;s<=(sqrt(2*n))/1;s++){
for(int i=0;i<=s;i++){
int j=s-i;
sss0.insert({3*i+1+3*j+1,{3*i+1,3*j+1}});
sss1.insert({3*i+1+3*j+1,{3*i+1,3*j+1}});sss1.insert({3*i+1+3*j+2,{3*i+1,3*j+2}});
sss1.insert({3*i+2+3*j+1,{3*i+2,3*j+1}});sss1.insert({3*i+2+1+3*j+2+1,{3*i+2,3*j+2}});
}
}
for(int i=1;i<=n;i++){
int ai;scanf("%d",&ai);
if(ai){
pair<int,pair<int,int>> t=*sss1.begin();
//cout<<"miao"<<t.second.first<<" "<<t.second.second<<endl;
if(sss0.count(t))sss0.erase(t);sss1.erase(t);
cout<<t.second.first<<" "<<t.second.second<<endl;
}
else {
pair<int,pair<int,int>> t=*sss0.begin();
sss1.erase(t);sss0.erase(t);
cout<<t.second.first<<" "<<t.second.second<<endl;
}
}
}
}
D. Simple Permutation
从n/3找一个最近的素数pos,之后pos-1,pos+1,pos-2,pos+2,可以保证平均数就为pos
最偏也就左n/3,右n/3,剩下n/3,前面左右的已经有n/3个平均为pos
最不偏是左n/2,右n/2,有n/2个平均为n/2
#include<iostream>
using namespace std;
int n;
const int N=100010;
int primes[N];
bool vis[N];int tot=0;
void ou_prime(){
for(int i=2;i<=100000;i++){
if(!vis[i])primes[++tot]=i;
for(int j=1;j<=tot&&i*primes[j]<=100000;j++){
vis[i*primes[j]]=1;
if(i%primes[j]==0)break;
}
}
}
bool isprime(int x){
int t=lower_bound(primes+1,primes+tot+1,x)-primes;
return primes[t]==x;
}
int main(){
int T;cin>>T;
ou_prime();
while(T--){
cin>>n;
int pos=max(1,n/3);
while(!isprime(pos))pos++;
cout<<pos<<" ";
for(int i=pos-1,j=pos+1;;i--,j++){
if(i>=1&&j<=n){
cout<<i<<" "<<j<<" ";
}
else if(i>=1){
cout<<i<<" ";
}else if(j<=n){
cout<<j<<" ";
}else break;
}
cout<<endl;
}
}

浙公网安备 33010602011771号