WA0求助
查看原帖
WA0求助
729231
SmpaelFx楼主2023/11/16 21:26
#include<bits/stdc++.h>
using namespace std;
int T;
int n,m,k;
int a[2000005];
vector<pair<int,pair<int,int> > > ans;
queue<int> q;
int p[605];//-1:no
void clear(queue<int> q){
    while(!q.empty()) q.pop();
}
bool isTop[605];
deque<int> st[305];
void base(int c){
    if(p[c]!=-1){
        ans.push_back({1,{p[c],0}});
        isTop[c]=0;
        st[p[c]].pop_back();
        q.push(p[c]);
        if(!st[p[c]].empty()) isTop[st[p[c]].back()]=1;
        p[c]=-1;
    }
    else{
        p[c]=q.front();
        q.pop();
        ans.push_back({1,{p[c],0}});
        if(!st[p[c]].empty()) isTop[st[p[c]].back()]=0;
        st[p[c]].push_back(c);
        isTop[c]=1;
    }
}
int main(){
    scanf("%d",&T);
    while(T--){
        memset(a,0,sizeof(a));
        memset(p,-1,sizeof(p));
        memset(isTop,0,sizeof(isTop));
        ans.clear();
        clear(q);
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=m;i++) scanf("%d",&a[i]);
        int sp=n;
        for(int i=1;i<n;i++) q.push(i),q.push(i);
        for(int i=1;i<=n;i++) st[i].clear();
        for(int i=1;i<=m;i++){
            if(p[a[i]]!=-1){
                if(isTop[a[i]]){
                    ans.push_back({1,{p[a[i]],0}});
                    isTop[a[i]]=0;
                    st[p[a[i]]].pop_back();
                    q.push(p[a[i]]);
                    if(!st[p[a[i]]].empty()) isTop[st[p[a[i]]].back()]=1;
                    p[a[i]]=-1;
                }
                else{
                    ans.push_back({1,{sp,0}});
                    ans.push_back({2,{p[a[i]],sp}});
                    st[p[a[i]]].pop_front();
                    q.push(p[a[i]]);
                    p[a[i]]=-1;
                }
            }
            else{
                if(!q.empty()){
                    p[a[i]]=q.front();
                    q.pop();
                    ans.push_back({1,{p[a[i]],0}});
                    if(!st[p[a[i]]].empty()) isTop[st[p[a[i]]].back()]=0;
                    st[p[a[i]]].push_back(a[i]);
                    isTop[a[i]]=1;
                }
                else{
                    int x=-1,j;
                    for(j=i+1;j<=m;j++){
                        if(!isTop[a[j]]){
                            x=j;
                            break;
                        }
                    }
                    x=a[j];
                    if(x==a[i]){
                        ans.push_back({1,{sp,0}});
                        for(++i;i<j;i++){
                            base(a[i]);
                        }
                        ans.push_back({1,{sp,0}});
                        continue;
                    }
                    int y=st[p[x]].back();
                    int cnt=0;
                    for(int k=i+1;k<j;k++){
                        if(a[k]==y) cnt++;
                    }
                    if(cnt%2==0){
                        st[p[x]].push_back(a[i]);
                        ans.push_back({1,{p[x],0}});
                        isTop[a[i]]=1;
                        isTop[y]=0;
                        p[a[i]]=p[x];
                        for(++i;i<j;i++){
                            if(a[i]!=y){
                                base(a[i]);
                            }
                            else{
                                ans.push_back({1,{sp,0}});
                            }
                        }
                        ans.push_back({1,{sp,0}});
                        ans.push_back({2,{p[x],sp}});
                        p[x]=-1;
                    }
                    else{
                        ans.push_back({1,{sp,0}});
                        q.push(sp);
                        isTop[a[i]]=1;
                        p[a[i]]=sp;
                        st[sp].push_back(a[i]);
                        for(++i;i<j;i++){
                            if(a[i]!=y){
                                base(a[i]);
                            }
                            else{
                                ans.push_back({1,{p[x],0}});
                            }
                        }
                        sp=p[x];
                        ans.push_back({1,{sp,0}});
                        st[sp].pop_front();
                        p[x]=-1;
                        p[y]=-1;
                        isTop[y]=0;
                    }
                }
            }
        }
        printf("%ld\n",ans.size());
        for(auto p:ans){
            if(p.first==1){
                printf("1 %d\n",p.second.first);
            }
            else{
                printf("2 %d %d\n",p.second.first,p.second.second);
            }
        }
    }
    return 0;
}
2023/11/16 21:26
加载中...