给定一个 n n n行 m m m列的网格,每个格子有一个正整数。一个_优秀_的网格,要求每行的数字单调不减。
换句话说,对任意 1 ≤ i ≤ n 1 le i le n 1≤i≤n且 2 ≤ j ≤ m 2 le j le m 2≤j≤m,都有
a i , j ≥ a i , j − 1 a_{i,j} ge a_{i,j-1} ai,j≥ai,j−1。
你不得不做以下的操作仅一次:选择第 i i i列和第 j j j列(不要求不同), 1 ≤ i , j ≤ m 1 le i,j le m 1≤i,j≤m,并交换它们。
求出这个网格在经过一次交换后是否可以变得优秀。如果可以,求出需要选择的列。
输入格式由多组测试数据。
第一行为一个整数 t ( 1 ≤ t ≤ 100 ) t (1 le t le 100) t(1≤t≤100)。测试点的描述如下。
第一行为两个整数 n n n和 m m m ( 1 ≤ n , m ≤ 2 ⋅ 1 0 5 ) ( 1 le n,m le 2 cdot 10^5) (1≤n,m≤2⋅105)表示行列的数目。
以下 n n n行包含 m m m个整数,第 i i i行第 j j j列为 a i , j ( 1 ≤ a i , j ≤ 1 0 9 ) a_{i,j} (1 le a_{i,j} le 10^9) ai,j(1≤ai,j≤109),表示第 i i i行第 j j j列的数。
保证所有测试数据的 n ⋅ m n cdot m n⋅m之和不超过 2 ⋅ 1 0 5 2 cdot 10^5 2⋅105。
输出格式如果经过这次交换不能得到一个好的网格,输出 − 1 -1 −1。
如果能,输出 2 2 2个整数表示需要交换的列。
如果有多组解,输出任意一组解。
输入输出样例| 输入 | 输出 |
|---|---|
| 5 2 3 1 2 3 1 1 1 2 2 4 1 2 3 2 2 2 1 1 1 2 3 6 2 1 5 4 3 2 1 1 2 | 1 1 -1 1 2 1 3 1 1 |
在第一个测试数据中,这个表一开始是好的,所以随便选一个自己和自己交换。
在第二个测试数据中,无解。
在第三个测试数据中,必须交换第一列和第二列。
题解有一种简单的思路是,将序列暴力排序,找不同,然后按照条件交换所有序列暴力枚举。
代码如下:
#includeusing namespace std; void solve(vector > &a) { int n=a.size(),m=a[0].size(); vector bad; for(int i=0;i vector b=a[i]; sort(b.begin(),b.end()); for(int j=0;j printf("1 1n"); return; } if((int)bad.size()>2) { printf("-1n"); return; } for(int i=0;i if(a[i][j] printf("-1n"); return; } } printf("%d %dn",bad[0]+1,bad[1]+1); } int main() { int T; scanf("%d",&T); while(T--) { int n,m; scanf("%d%d",&n,&m); vector > a(n,vector (m)); for(int i=0;i



