Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34073 | LYLAKIOIAKIOI | 【S】T2 | C++ | 解答错误 | 5 | 263 MS | 848 KB | 3256 | 2024-11-03 14:27:21 |
#include<bits/stdc++.h> #define pii pair<int,int> #define mk make_pair #define fi first #define se second using namespace std; const int N=2e6+10; int n; int p[N];int L; bool ok=0; bool chk(){ for(int i=1;i<=n;i++) if(p[i]!=i) return 0;return 1; }int op[N][3]; int t[N]; int opt=0; void add(int x,int y,int z){ ++opt;op[opt][0]=x,op[opt][1]=y,op[opt][2]=z; if(p[x]>p[z]) swap(p[x],p[y]); else swap(p[y],p[z]); } void m1(){ int ps=0;for(int i=1;i<=n;i++) if(p[i]==1) ps=i; pii mn=mk(0x3f3f3f3f,0); for(int i=ps+1;i<=n;i++) mn=min(mn,mk(p[i],i)); if(p[1]>mn.fi){ add(1,ps,mn.se); }else{ pii mx=mk(0,0); for(int i=1;i<=ps-1;i++) mx=max(mx,mk(p[i],i)); if(mx.fi<mn.fi){ if(p[1]==2&&p[2]==1) add(1,2,n-1); else if(p[1]==2){ int pos=0; for(int i=1;i<=ps-1;i++) if(p[i]==ps) pos=i; add(1,pos,ps); } for(int i=1;i<=ps-1;i++){ if(p[i]<p[1]){ add(1,i,n);break; } } }else{ bool fla=0;int pos=0; for(int i=1;i<=ps-1;i++) if(p[i]==ps) fla=1,pos=i; if(fla){ add(1,pos,ps); }else{ for(int i=1;i<=n;i++){ t[i]=0; }for(int i=ps+1;i<=n;i++) t[p[i]]=i; for(int i=1;i<=ps-1;i++){ if(fla) break; if(p[i]<p[1]&&t[i]!=0){ fla=1; add(1,i,t[i]); } }if(!fla) add(1,mx.se,ps); } }for(int i=ps+1;i<=n;i++){ if(p[i]<p[1]){ add(1,ps,i);break; } } } } bool work(){//n-2 opt=0; if(p[n]==1) return 0; int mn=n+1,mx=0; if(p[1]!=1) m1(); for(int i=1;i<=n;i++) t[i]=0; for(int i=1;i<=n;i++) t[p[i]]=i; for(int i=2;i<=n;i++){ if(t[i]==i) continue; swap(t[p[i]],t[i]); add(1,i,t[p[i]]); } if(opt>L) return 0; if(!chk()) return 0; return 1; }bool work3(){ opt=0; if(chk()) return 1; for(int i=1;i<=L;i++){ add(1,2,3); if(chk()) return 1; }return 0; } void slv(){ cin>>n>>L; for(int i=1;i<=n;i++) cin>>p[i]; if(n<=3){ if(n==3){ if(work3()){ cout<<opt<<'\n'; for(int i=1;i<=opt;i++){ for(int j=0;j<=2;j++) cout<<op[i][j]<<' '; cout<<'\n'; } }else{ cout<<-1<<'\n'; } }else{ opt=0; if(chk()) cout<<0<<'\n'; else cout<<-1<<'\n'; } return ; } if(work()){ cout<<opt<<'\n'; for(int i=1;i<=opt;i++){ for(int j=0;j<=2;j++) cout<<op[i][j]<<' '; cout<<'\n'; } }else{ cout<<-1<<'\n'; } } int main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int t;cin>>t;while(t--) slv(); cout.flush();cout.flush(); }