80分求助 大佬
查看原帖
80分求助 大佬
1318260
w505255252楼主2025/8/1 19:28
#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的再怎么样也得取一个才行吧 求助大佬

2025/8/1 19:28
加载中...