提交时间:2024-11-04 10:43:21

运行 ID: 34258

#include<bits/stdc++.h> using namespace std; long long T,n,l,a[2000006],flag,af[2000006],top; struct sss{ long long i,j,k; }ans[2000006]; void p(long long top){ printf("%lld\n",top); for(int i=1;i<=top;i++){ printf("%lld %lld %lld\n",ans[i].i,ans[i].j,ans[i].k); } } void dfs(long long a[],long long top,sss ans[]){ if(flag==1 || top>l)return; if(a[1]==1 && a[2]==2 && a[3]==3 && a[4]==4){ p(top); flag=1; return; } for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ for(int k=j+1;k<=n;k++){ if(a[i]>a[k]){ swap(a[i],a[j]); ans[top+1]=((sss){i,j,k}); dfs(a,top+1,ans); swap(a[i],a[j]); } else{ swap(a[k],a[j]); ans[top+1]=((sss){i,j,k}); dfs(a,top+1,ans); swap(a[k],a[j]); } } } } } void ad(long long i,long long j,long long k){ ans[++top]=((sss){i,j,k}); if(a[i]>a[k]) swap(af[a[i]],af[a[j]]),swap(a[i],a[j]); else swap(af[a[j]],af[a[k]]),swap(a[k],a[j]); } int main(){ scanf("%lld",&T); while(T--){ scanf("%lld%lld",&n,&l); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); af[a[i]]=i; } if(n==1){ printf("0\n"); continue; } if(a[n]==1){ printf("-1\n"); continue; } else if(n==2){ if(a[1]==1 && a[2]==2){ printf("0\n"); } else printf("-1\n"); continue; } else if(n==3){ long long flag=0; for(int i=0;i<=l;i++){ if(a[1]==1 && a[2]==2 && a[3]==3){ printf("%lld\n",i); a[1]=-114; flag=1; for(int j=1;j<=i;j++){ printf("1 2 3\n"); } break; } if(i==l)break; if(a[1]>a[3]){ swap(a[1],a[2]); } else{ swap(a[2],a[3]); } } if(flag==0)printf("-1\n"); continue; } else if(n==4){ flag=0; dfs(a,0,ans); if(flag==0)printf("-1\n"); continue; } if(a[1]==1){ for(long long i=2;i<=n;i++){ if(a[i]!=i){ ad(1,i,af[i]); } } p(top); continue; } long long flag=0; for(int i=1;i<=n;i++){ if(i>af[1] && a[i]<a[1]){ flag=i; break; } } top=0; if(a[1]==n){ ad(1,af[1],n); } else if(flag!=0){ ad(1,af[1],flag); } else if(a[1]>=3){ long long flag=0; for(int i=1;i<a[1];i++){ if(af[i]>af[1]){ flag=1; ad(1,af[1],af[i]); } } if(flag==0){//小于$a_1$得数全在他左边 //所以需要先把2移到最右侧 ad(1,af[2],n),ad(1,af[1],n); } } else if(af[n]<af[1]){ ad(1,af[n],af[1]); ad(1,af[1],n); } else if(a[2]!=1){ ad(1,2,af[n]); ad(1,2,af[1]); ad(1,af[1],n); } else{ long long t; for(int i=n;i>=1;i--){ if(a[i]!=i){ t=i; break; } } if(t!=2){ ad(1,2,af[t]); ad(1,2,af[1]); ad(1,af[1],t); } else{ ad(1,3,n); //2 1 n ~ 3 ad(1,2,3); //2 n 1 ~ 3 ad(1,2,3); //n 2 1 ~ 3 ad(1,3,n); //1 2 n ~ 3 } } for(long long i=2;i<=n;i++){ if(a[i]!=i){ ad(1,i,af[i]); } } p(top); } }