整体二分 WA 18 求助
查看原帖
整体二分 WA 18 求助
361432
Froranzen楼主2022/7/19 16:46

RT,实在找不出来错了

#include <bits/stdc++.h>
#define rep(i, f, t) for(int i(f); i <= t; ++i)
#define re(i, t) for(int i(1); i <= t; ++i)
#define per(i, t, f) for(int i(t); i >= f; --i)
#define pe(i, t) for(int i(t); i >= 1; --i)
#define ste(i, f, t, s) for(int i(f); i <= t; i += s)
#define ets(i, t, f, s) for(int i(t); i >= f; i -= s)
#define each(i, x) for(auto &i : (x))
#define nx(i, u) for(int i(head[u]); i; i = e[i].nxt) 
typedef long long ll;
typedef long double lb;
typedef unsigned long long ull;
#define int long long
using namespace std;
typedef pair <double, int> pdi;
typedef pair <int, int> pii;
// typedef pair <string, bool> psb;
#define pb push_back
#define fi first
#define se second
#define ix(l, r) ((l + r) | (l != r))
#define ls ix(l, mid)
#define rs ix(mid + 1, r)
#define mp(i, j) (make_pair(i, j))
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define dinf 1000000000000.0
#define eps 1e-10
 
const int N = 5e4 + 5;
int n, m;
ll ans[N];

struct node {
    int op, l, r, k, id;
}q[N], q1[N], q2[N];

struct Tree {
    ll sum;
    ll laz;
}tr[N<<1];

void pushup (int l, int r) {
    int mid = (l + r) >> 1;
    tr[ix(l, r)].sum = tr[ls].sum + tr[rs].sum;
}

void pushdown (int l, int r) {
    int mid = (l + r) >> 1;
    if(ll laz = tr[ix(l, r)].laz) {
        tr[ls].laz += laz;
        tr[rs].laz += laz;
        tr[ls].sum += 1ll * (mid - l + 1) * laz;
        tr[rs].sum += 1ll * (r - mid) * laz;
        tr[ix(l, r)].laz = 0;
    }
}

void update (int l, int r, int dl, int dr, int w) {
    if(dl <= l && r <= dr) {
        tr[ix(l, r)].sum += (r - l + 1) * w;
        tr[ix(l, r)].laz += w;
        return ;
    }
    pushdown(l ,r);
    int mid = (l + r) >> 1;
    if(dl <= mid) update(l, mid, dl, dr, w);
    if(dr > mid) update(mid + 1, r, dl, dr, w);
    pushup(l, r);
}

ll query (int l, int r, int dl, int dr) {
    if(dl <= l && r <= dr) {
        return tr[ix(l ,r)].sum;
    }
    ll res = 0;
    pushdown(l, r);
    int mid = (l + r) >> 1;
    if(dl <= mid) res += query(l, mid, dl, dr);
    if(dr > mid) res += query(mid + 1, r, dl, dr);
    return res;
}

void solve (int l, int r, int ql, int qr) {
    if(l == r) {
        rep(i, ql, qr) if(q[i].op == 2) ans[q[i].id] = l;
        return ;
    }
    int mid = (l + r) >> 1;
    int tot1 = 0, tot2 = 0;
    rep(i, ql, qr) {
        if(q[i].op == 1) {
            if(q[i].k > mid) {
                update(1, n, q[i].l, q[i].r, 1);
                q2[++tot2] = q[i];
            }
            else q1[++tot1] = q[i];
        }
        else {
            ll t = query(1, n, q[i].l, q[i].r);
            if(q[i].k > t) q[i].k -= t, q1[++tot1] = q[i];
            else q2[++tot2] = q[i];
        }
    }
    re(i, tot1) q[i + ql - 1] = q1[i];
    re(i, tot2) q[i + ql + tot1 - 1] = q2[i];
    re(i, tot2) {
        update(1, n, q2[i].l, q2[i].r, -1);
    }
    solve(l, mid, ql, ql + tot1 - 1);
    solve(mid + 1, r, ql + tot1, qr);
}

signed main () {
    freopen("1.in", "r", stdin);
    ios::sync_with_stdio(false);
    cin >> n >> m;
    re(i, m) {
        cin >> q[i].op >> q[i].l >> q[i].r >> q[i].k;
        q[i].id = i;
    }
    solve(-n, n, 1, m);
    re(i, m) {
        if(ans[i]) cout << ans[i] << "\n";
    }
    return 0;
}
2022/7/19 16:46
加载中...