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的是最开始放多少个进去,
image
现在看的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;

}


}
posted @ 2025-07-11 09:11  arin876  阅读(15)  评论(0)    收藏  举报