#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INT_MAX LONG_LONG_MAX
#define INT_MIN LONG_LONG_MIN
vector<int>a[1000005];
int n,m,t;
int work(int mid) {
int maxy;
maxy = INT_MIN;
for(int i = 1; i<=n; i++) {
for(int j = 1; j<=m; j++) {
if(a[i][j]<mid && j<maxy) {
return 0;
} else if(a[i][j]<mid) {
maxy = j;
}
}
}
return 1;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--) {
cin>>n>>m;
for(int i = 1; i<=n; i++) {
a[i].push_back(0);
for(int j = 1; j<=m; j++) {
int x;
cin>>x;
a[i].push_back(x);
}
}
int l = 0,r = n*m;
while(l<=r) {
int mid;
mid = (l+r)/2;
if(work(mid)) {
l = mid+1;
} else {
r = mid-1;
}
}
cout<<r<<"\n";
}
return 0;
}
本人像上面这样写就不对,可是把二维改成一维就过了!
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define INT_MAX LONG_LONG_MAX
#define INT_MIN LONG_LONG_MIN
int a[1000005];
int n,m,t;
int work(int mid) {
int maxy;
maxy = INT_MIN;
for(int i = 1; i<=n; i++) {
for(int j = 1; j<=m; j++) {
if(a[(i-1)*m+j]<mid && j<maxy) {
return 0;
} else if(a[(i-1)*m+j]<mid) {
maxy = j;
}
}
}
return 1;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t--) {
cin>>n>>m;
for(int i = 1; i<=n*m; i++) {
cin>>a[i];
}
int l = 0,r = n+m-1;
while(l<=r) {
int mid;
mid = (l+r)/2;
if(work(mid)) {
l = mid+1;
} else {
r = mid-1;
}
}
cout<<r<<"\n";
}
return 0;
}
求助QAQ