这题可以作为二分的板子
二分简单 但是细节绝对不简单
参考文献(”https://zhuanlan.zhihu.com/p/533408649
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, k, t, m, num1, num2, maxx, minn;
char op;
vector<vector<int>> g;
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> k >> t;
g.resize(n + 1, vector<int>(k + 1));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= k; j++)
cin >> g[i][j];
for (int i = 2; i <= n; i++)
for (int j = 1; j <= k; j++)
g[i][j] |= g[i - 1][j];
while (t--) {
maxx = 1, minn = n;
cin >> m;
while (m--) {
cin >> num1 >> op >> num2;
int ll = 1, rr = n;
if (op == '<') {//右边界
if (g[1][num1] >= num2)
minn = -1;
else {
while (ll < rr) {
int mid = (ll + rr+1) >> 1;
if (g[mid][num1] < num2)
ll = mid;
else
rr = mid-1;
}
minn = min(minn, ll);
}
}
else {//左边界
if (g[n][num1] <= num2)
minn = -1;
else {
while (ll < rr) {
int mid = (ll + rr) >> 1;
if (g[mid][num1] <= num2)
ll = mid + 1;
else
rr = mid;
}
maxx = max(maxx, ll);
}
}
}
cout << (maxx <= minn ? maxx : -1) << endl;
}
return 0;
}
边界问题以及+1还是-1都在一题里面 参考文献是从0-n-1我的数组开的是1-n所以有一处不一样