#define N 500005
struct pts {
int root[N], lc[N * 40], rc[N * 40], sz, tr[N * 40];
ll sum[N << 5];
void clear() {
for (int i = 0;i <= sz;i++)lc[i] = rc[i] = tr[i] = 0;
sz = 0;
}
void pushup(int p) {
sum[p] = sum[lc[p]] + sum[rc[p]];
}
int insert(int p, int pl, int pr, int k) {
int now = ++sz;
tr[now] = tr[p] + 1;
lc[now] = lc[p];
rc[now] = rc[p];
if (pl == pr) {
sum[now] = (long long)pl * tr[now];
return now;
}
int mid = pl + pr >> 1;
if (k <= mid) {
lc[now] = insert(lc[p], pl, mid, k);
} else {
rc[now] = insert(rc[p], mid + 1, pr, k);
}
pushup(now);
return now;
}
ll query1(int u, int v, int pl, int pr, int x) {
if (pl >= x) {
return sum[v] - sum[u];
}
int mid = pl + pr >> 1;
if (x <= mid) {
return sum[rc[v]] - sum[rc[u]] + query1(lc[u], lc[v], pl, mid, x);
} else {
return query1(rc[u], rc[v], mid + 1, pr, x);
}
}
int query2(int u, int v, int pl, int pr, int l, int r) {
if (l <= pl && pr <= r) {
return tr[v] - tr[u];
}
int mid = pl + pr >> 1;
int res = 0;
if (l <= mid) {
res += query2(lc[u], lc[v], pl, mid, l, r);
}
if (r > mid) {
res += query2(rc[u], rc[v], mid + 1, pr, l, r);
}
return res;
}
}ptr;
int r, c, m;
ll h;
int xx1, yy1, xx2, yy2;
bool ck(int mid, int l, int r) {
ll s = ptr.query1(ptr.root[l - 1], ptr.root[r], 1, 1000, mid);
if (s < h) {
return false;
} else return true;
}
int f[205][205][1005];//个数
ll d[205][205][1005];//数值
bool CK(int mid) {
ll sum = d[xx2][yy2][mid] - d[xx2][yy1 - 1][mid] - d[xx1 - 1][yy2][mid] + d[xx1 - 1][yy1 - 1][mid];
if (sum < h)return false;
return true;
}
void solve() {
cin >> r >> c >> m;
if (r == 1) {
ptr.clear();
for (int i = 1;i <= c;i++) {
int temp;
cin >> temp;
ptr.root[i] = ptr.insert(ptr.root[i - 1], 1, 1000, temp);
}
while (m--) {
int x, l, r;
cin >> x >> l >> x >> r >> h;
int ll = 0, rr = 1000;
int ans = 1e9;
while (ll < rr) {
int mid = ll + rr + 1 >> 1;
if (ck(mid, l, r)) {
ll = mid;
ans = ll;
} else rr = mid - 1;
}
if (ans == 1e9)cout << "Poor QLW" << endl;
else {
int g = ptr.query2(ptr.root[l - 1], ptr.root[r], 1, 1000, ans, 1000);
long long sum = ptr.query1(ptr.root[l - 1], ptr.root[r], 1, 1000, ans);
cout << g - (sum - h) / ans << endl;
}
}
} else {
for (int i = 1;i <= r;i++) {
for (int j = 1;j <= c;j++) {
int temp;
cin >> temp;
for (int k = 1;k <= 1000;k++) {
f[i][j][k] = f[i - 1][j][k] + f[i][j - 1][k] - f[i - 1][j - 1][k] + (k <= temp ? 1 : 0);
d[i][j][k] = d[i - 1][j][k] + d[i][j - 1][k] - d[i - 1][j - 1][k] + (k <= temp ? temp : 0);
}
}
}
while (m--) {
cin >> xx1 >> yy1 >> xx2 >> yy2 >> h;
int l = 0;
int r = 1000;
int ans = 1e9;
while (l < r) {
int mid = l + r + 1 >> 1;
if (CK(mid)) {
l = mid;
ans = l;
} else r = mid - 1;
}
if (ans == 1e9) {
cout << "Poor QLW" << endl;
} else {
ll sum = d[xx2][yy2][ans] - d[xx2][yy1 - 1][ans] - d[xx1 - 1][yy2][ans] + d[xx1 - 1][yy1 - 1][ans];
int g = f[xx2][yy2][ans] - f[xx2][yy1 - 1][ans] - f[xx1 - 1][yy2][ans] + f[xx1 - 1][yy1 - 1][ans];
cout << g - (sum - h) / ans << endl;
}
}
}
}
为什么二分的时候l=0就能得到100,但是l=1只能得到80,数据范围h是大于1的再怎么样也得取一个才行吧 求助大佬