
分析
对于数据 n,m<=2500, 优化读入
考虑二分该值 x
对于 check() 只需要满足每列都要有至少一个不小于x且至少有一行存在至少有两个不小于 x 则 true 否则 false
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| int n,m; int v[2505][2505];
int col[2505],row[2505]; int chk(int x){ for(int i = 1;i <= m;i++) col[i] = 0; for(int i = 1;i <= n;i++) row[i] = 0; for(int i = 1;i <= n;i++) for(int j = 1;j <= m;j++) if(v[i][j] >= x) col[j]++,row[i]++; for(int i = 1;i <= m;i++) if(!col[i]) return false; for(int i = 1;i <= n;i++) if(row[i] >= 2) return true; return false; } signed main() { n = read(),m = read(); for(int i = 1;i <= n;i++)for(int j = 1;j <= m;j++) v[i][j] = read();
int l = 0,r = 1e9; while(l < r){ int mid = l + r + 1>> 1; if(chk(mid)) l = mid; else r = mid - 1; } print(l); return 0; }
|