Idleness limit exceeded
  • 板块学术版
  • 楼主262620zzj
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/16 18:41
  • 上次更新2024/3/16 20:48:50
查看原帖
Idleness limit exceeded
575698
262620zzj楼主2024/3/16 18:41

CF1896G

//#define DEBUG
#include<bits/stdc++.h>
using namespace std;
int n,N,lim,pepe[30][500],winner;
int x[500],y[500],num[30],x2[500],pos[500];
bool vis[500];
set<int> slow;
void init(int n){
	N=n*n;
    lim=n*n-n+1;
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)pepe[i][j]=(i-1)*n+j;
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
        int __=(i-1)*n+j;
        x2[__]=x[__]=i;
        y[__]=j;
    }
    num[0]=num[n+1]=0;
	for(int i=1;i<=n;i++)num[i]=n;
    slow.clear();
}
void _move(int a,int to){
    int g=x[a],z=y[a];
    if(to)x2[a]=to;
    x[a]=to;
    y[a]=++num[to];
    pepe[to][num[to]]=a;
    pepe[g][z]=pepe[g][num[g]];
    pepe[g][num[g]--]=0;
    y[pepe[g][z]]=z;
}
void GOWORK(){
    cin>>n;
    if(n==1){
    	cout<<"! 1"<<endl;
    	return;
	} 
    init(n);
    #ifdef DEBUG 
     for(int i=1;i<=N;i++)cout<<x2[i]<<' '<<x[i]<<" "<<y[i]<<endl;
     for(int i=0;i<=n+1;i++){
         cout<<i<<"#"<<num[i]<<endl;
         for(int j=1;j<=num[i];j++){
             cout<<pepe[i][j]<<" ";
         }
         cout<<endl;
     }
    #endif
    for(int i=1;i<=n;i++){
        cout<<"? ";
        for(int j=1;j<=n;j++)cout<<pepe[i][j]<<' ';
        cout<<endl;
        cin>>winner;
        _move(winner,0);
        pos[winner]=i;
        for(int j=1;j<=num[i];j++)slow.insert(pepe[i][j]);
        #ifdef DEBUG
         for(int i=1;i<=N;i++)cout<<x2[i]<<' '<<x[i]<<" "<<y[i]<<endl;
         for(int i=0;i<=n+1;i++){
             cout<<i<<"#"<<num[i]<<endl;
             for(int j=1;j<=num[i];j++){
                 cout<<pepe[i][j]<<" ";
             }
             cout<<endl;
         }
        #endif
    }
    while(114514){
        cout<<"? ";
        for(int i=1;i<=n;i++)cout<<pepe[0][i]<<' ';
        cout<<endl; 
        cin>>winner;
        int lastx=pos[winner];
        _move(winner,n+1);
        if(num[n+1]>=lim)break;
        if(num[lastx]==0)winner=*(slow.begin());
        else if(num[lastx]==1)winner=pepe[lastx][1];
        else{
            cout<<"? ";
            int cnt=0;
            for(int i=1;i<=num[lastx];i++){
            	cout<<pepe[lastx][i]<<' ';
				cnt++;
				vis[pepe[lastx][i]]=1;
			}
            for(int elem:slow){
                if(cnt>=n)break;
                if(vis[elem])continue;
                cout<<elem<<' ';
                ++cnt;
            }
            cout<<endl;
            cin>>winner;
            for(int i=1;i<=num[lastx];i++)vis[pepe[lastx][i]]=0;
        }
        _move(winner,0);
        pos[winner]=lastx;
        slow.erase(winner);
        #ifdef DEBUG
         for(int i=1;i<=N;i++)cout<<x2[i]<<' '<<x[i]<<" "<<y[i]<<endl;
         for(int i=0;i<=n+1;i++){
             cout<<i<<"#"<<num[i]<<endl;
             for(int j=1;j<=num[i];j++){
                 cout<<pepe[i][j]<<" ";
             }
             cout<<endl;
         }
         for(int elem:slow)cout<<elem<<' ';
         cout<<endl;
        #endif
    }
    cout<<"! ";
    for(int i=1;i<=lim;i++)cout<<pepe[n+1][i]<<' ';
    cout<<endl;
}
int main(){
    int DAY;
    cin>>DAY;
    while(DAY--)GOWORK();
    return 0;
}
/*
1 3 4 2
7 1 2 8 9 3 4 5 6
*/

前两个点过了,第三个点为什么会ildeness limit exceeded

2024/3/16 18:41
加载中...