按照排序后找不同的元素下标判断写的,hack了4个小时没搞出来
巨佬救我
#include<bits/stdc++.h>
using namespace std;
long long a[200010];
long long b[200010];
long long cnt[200010];
long long x[200010];
long long y[200010];
long long flagsame[200010];
bool cmp(long long x,long long y)
{
return x<y;
}
int main()
{
long long t;
cin>>t;
while(t--)
{
long long n,m;
cin>>n>>m;
memset(cnt,0,sizeof(cnt));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(flagsame,0,sizeof(flagsame));
for(long long i=1;i<=n;i++)
{
for(long long j=1;j<=m;j++)
{
cin>>a[j];
b[j]=a[j];
}
sort(a+1,a+1+m,cmp);
long long prea=a[1];
for(long long j=1;j<=m;j++)
{
if(a[j]!=b[j])
{
if(cnt[i]==0)
{
x[i]=j;
cnt[i]++;
}
else if(cnt[i]==1)
{
y[i]=j;
cnt[i]++;
}
else
{
cnt[i]=-1;
break;
}
}
if(prea!=a[j])
{
flagsame[i]=1;
}
prea=a[j];
}
}
int prex=x[1],prey=y[1];
int flag1=0;
for(int i=1;i<=n;i++)
{
if(cnt[i]==-1)
{
cout<<-1<<'\n';
flag1=1;
break;
}//(prex!=x[i]||prey!=y[i])&&(flagsame[i-1]!=0&&flagsame[i]!=0)
else if((prex!=x[i]||prey!=y[i])&&flagsame[i]!=0)
{
cout<<-1<<'\n';
flag1=1;
break;
}
// else if(prex==x[i]&&prey==y[i]||flagsame[i]==0||flagsame[i-1]==0)
// {
// continue;
// }
prex=x[i];
prey=y[i];
int p=i;
while(p>=1)
{
if(flagsame[p]!=0)
{
prex=x[p];
prey=y[p];
break;
}
p--;
}
if(p==1&&x[p]==0&&y[p]==0)
{
prex=0;
prey=0;
}
}
;
if(flag1==0&&prex==prey&&cnt[1]==0)
{
cout<<"1 1\n";
}
else if(flag1==0)
{
cout<<prex<<' '<<prey<<'\n';
}
}
return 0;
}