提交时间:2024-11-03 14:46:52

运行 ID: 34085

#include<bits/stdc++.h> using namespace std; #define int long long #define endl "\n" int n,L; int p[100300]; int loc[100300]; struct tri{int a,b,c;}; vector<tri>ANS; inline bool dop(int i,int j,int k){ // cout<<i<<" "<<j<<" "<<k<<endl; if(i>=j||j>=k)return 0; ANS.push_back({i,j,k}); if(p[i]>p[k])swap(p[i],p[j]); else swap(p[j],p[k]); return 1; } inline bool SW(int i,int j){ if(i>j)swap(i,j); // cout<<i<<" "<<j<<endl; return dop(1,i,j); } inline bool dfs(int dep){ bool ok=1; for(int i=1;i<=n;i++)ok&=p[i]==i; // for(int i=1;i<=n;i++) // cout<<p[i]<<" "; // cout<<endl; // cout.flush(); if(ok){ return 1; } // cerr<<"!"<<endl; // cerr.flush(); if(dep>=L)return 0; int pp[11]; for(int i=1;i<=n;i++) pp[i]=p[i]; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j+1;k<=n;k++){ dop(i,j,k); if(dfs(dep+1))return 1; for(int i=1;i<=n;i++) p[i]=pp[i]; ANS.pop_back(); } return 0; } inline bool chk(){ for(int i=1;i<=n;i++) if(p[i]!=i)return 0; return 1; } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("genshin.in","r",stdin); // freopen("genshin.out","w",stdout); /* 4 4 1 3 4 2 */ int t; cin>>t; int ct=0; while(t--){ ct++; cin>>n>>L; ANS.clear(); for(int i=1;i<=n;i++)cin>>p[i],loc[p[i]]=i; // if(ct==3547){ // cout<<n<<" "<<L<<endl; // for(int i=1;i<=n;i++) // cout<<p[i]<<" "; // cout<<endl; // return 0; // } // else continue; if(chk()){ cout<<0<<endl; continue; } if(p[n]==1) cout<<"-1"<<endl; else if(loc[1]==1){ for(int i=2;i<=n;i++) while(p[i]!=i&&ANS.size()<=L){ if(!SW(i,p[i]))break; } if(chk()&&ANS.size()<=L){ cout<<ANS.size()<<endl; for(auto e:ANS) cout<<e.a<<" "<<e.b<<" "<<e.c<<endl; // assert(chk()); } else cout<<-1<<endl; } else if(loc[n]<loc[1]||p[1]!=2){ if(loc[n]==1)dop(1,loc[1],n); else if(loc[n]<loc[1])dop(1,loc[n],loc[1]),dop(1,loc[1],n); else if(loc[2]>loc[1])dop(1,loc[1],loc[2]); else dop(1,loc[2],loc[n]),dop(1,loc[1],loc[n]); for(int i=2;i<=n;i++) while(p[i]!=i&&ANS.size()<=L){ if(!SW(i,p[i]))break; } if(chk()&&ANS.size()<=L){ cout<<ANS.size()<<endl; for(auto e:ANS) cout<<e.a<<" "<<e.b<<" "<<e.c<<endl; // assert(chk()); } else cout<<-1<<endl; } else{ int mx=0; for(int i=2;i<loc[1];i++) mx=max(mx,p[i]); int mn=n; for(int i=loc[1]+1;i<=n;i++) mn=min(mn,p[i]); if(mx>mn)dop(1,loc[mx],loc[1]),dop(1,loc[1],loc[mn]); else if(loc[n]!=n)dop(1,loc[1],loc[n]),dop(1,loc[1],loc[n]),dop(1,loc[n],n); else if(loc[1]==2){ int now=3; while(p[now]==now)now++; if(now==n+1)now=3; int x=loc[loc[now]]; dop(1,2,x); dop(1,2,x); dop(1,x,loc[now]); } else dop(1,2,n),dop(1,2,loc[1]),dop(1,loc[1],n); for(int i=2;i<=n;i++) while(p[i]!=i&&ANS.size()<=L){ if(!SW(i,p[i]))break; } if(chk()&&ANS.size()<=L){ cout<<ANS.size()<<endl; for(auto e:ANS) cout<<e.a<<" "<<e.b<<" "<<e.c<<endl; // assert(chk()); } else cout<<-1<<endl; } } cout.flush(); return 0; }