线段树题1pts求调
查看原帖
线段树题1pts求调
716260
SegmentTree_楼主2025/7/22 11:33
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned ll
#define ui unsigned int
#define i128 __int128
#define lid (id << 1)
#define rid (id << 1 | 1)
typedef pair<int, int> pii;
typedef pair<int, ll> pil;
typedef pair<ll, int> pli;
typedef pair<ll, ll> pll;
const int N = 5e5+5;
namespace tianyu{
    struct node{
        int l, r;
        ll mx, mxb, t1, t2;
        bool t3;
    }tr[N << 2];
    void mktg(int id, int t1, int t2){
        tr[id].mxb = max(tr[id].mxb, tr[id].mx + t2);
        tr[id].mx += t1;
        tr[id].t2 = max(tr[id].t2, tr[id].t1 + t2);
        tr[id].t1 += t1;
    }
    void reset(){
        tr[1].t1 = tr[1].t2 = 0;
        tr[1].mxb = tr[1].mx;
        tr[1].t3 = 1;
    }
    void pushdown(int id){
        mktg(lid, tr[id].t1, tr[id].t2);
        mktg(rid, tr[id].t1, tr[id].t2);
        tr[id].t1 = tr[id].t2 = 0;
        if (tr[id].t3){
            tr[lid].mxb = tr[lid].mx;
            tr[rid].mxb = tr[rid].mx;
            tr[lid].t3 = tr[rid].t3 = 1;
            tr[id].t3 = 0;
        }
    }
    void pushup(int id){
        tr[id].mx = max(tr[lid].mx, tr[rid].mx);
        tr[id].mxb = max(tr[lid].mxb, tr[rid].mxb);
    }
    void build(int id, int l, int r){
        tr[id].l = l;
        tr[id].r = r;
        tr[id].mx = tr[id].mxb = tr[id].t1 = tr[id].t2 = 0;
        if (l == r) return;
        int mid = l + r >> 1;
        build(lid, l, mid);
        build(rid, mid + 1, r);
    }
    void add(int id, int l, int r, int k){
        if (l <= tr[id].l && tr[id].r <= r){
            tr[id].mx += k;
            tr[id].mxb = max(tr[id].mxb, tr[id].mx);
            tr[id].t1 += k;
            tr[id].t2 = max(tr[id].t2, tr[id].t1);
            return;
        }
        pushdown(id);
        int mid = tr[id].l + tr[id].r >> 1;
        if (r <= mid) add(lid, l, r, k);
        else if (l > mid) add(rid, l, r, k);
        else add(lid, l, mid, k), add(rid, mid + 1, r, k);
        pushup(id);
    }
    ll query(int id, int l, int r){
        if (l <= tr[id].l && tr[id].r <= r) return tr[id].mxb;
        pushdown(id);
        int mid = tr[id].l + tr[id].r >> 1;
        if (r <= mid) return query(lid, l, r);
        else if (l > mid) return query(rid, l, r);
        else return max(query(lid, l, mid), query(rid, mid + 1, r));
    }
    struct mod{
        int l, r, x;
        mod(int a, int b, int c) : l(a), r(b), x(c) {}
    };
    vector<mod> md[N];
    struct que{
        int l, r, l1, r1, id;
        que(){}
        que(int a, int b, int c, int d, int e) : l(a), r(b), l1(c), r1(d), id(e) {}
    };
    vector<que> qu[N << 2];
    void insert(int id, int l, int r, int ql, int qr, que k){
        int mid = l + r >> 1;
        if (ql <= mid + 1 && mid <= qr){
            qu[id].emplace_back(k);
            return;
        }
        if (qr < mid) insert(lid, l, mid, ql, qr, k);
        else insert(rid, mid + 1, r, ql, qr, k);
    }
    void add(int p, bool op){
        if (op){
            for (int i = 0;i < md[p].size();i++){
                // cout << p << ' ' << md[p][i].l << ' ' << md[p][i].r << ' ' << md[p][i].x << '\n';
                add(1, md[p][i].l, md[p][i].r, md[p][i].x);
            }
        }
        else{
            for (int i = md[p].size() - 1;i >= 0;i--){
                // cout << -p << ' ' << md[p][i].l << ' ' << md[p][i].r << ' ' << md[p][i].x << '\n';
                add(1, md[p][i].l, md[p][i].r, -md[p][i].x);
            }
        }
    }
    void print(int x){
        if (tr[x].l == tr[x].r){
            cout << tr[x].mx << ',' << tr[x].mxb << ' ';
            return;
        }
        pushdown(x);
        int id = x;
        print(lid);
        print(rid);
    }
    ll ans[N];
    que a[N];
    void solve(int id, int l, int r){
        if (l == r) return;
        // cout << id << ' ' << l << ' ' << r << ' ' << (l + r) / 2 << " 1111111111\n";
        int mid = l + r >> 1;
        for (int i = l;i <= mid;i++) add(i, 1);
        int cnt = 0, p = 1;
        for (auto i : qu[id]) a[++cnt] = i;
        sort(a + 1, a + 1 + cnt, [](que a, que b){
            return a.r1 < b.r1;
        });
        while (p <= cnt && a[p].r1 <= mid) ++p;
        reset();
        for (int i = mid + 1;i <= r;i++){
            add(i, 1);
            while (p <= cnt && a[p].r1 == i){
                ans[a[p].id] = max(ans[a[p].id], query(1, a[p].l, a[p].r));
                ++p;
            }
            // print(1);
            // cout << '\n';
        }
        for (int i = r;i > mid;i--) add(i, 0);
        // print(1);cout << '\n';
        solve(rid, mid + 1, r);
        cnt = 0, p = 1;
        for (auto i : qu[id]) a[++cnt] = i;
        sort(a + 1, a + 1 + cnt, [](que a, que b){
            return a.l1 > b.l1;
        });
        while (p <= cnt && a[p].l1 > mid) ++p;
        reset();
        for (int i = mid;i >= l;i--){
            while (p <= cnt && a[p].l1 == i){
                ans[a[p].id] = max(ans[a[p].id], query(1, a[p].l, a[p].r));
                // cout << a[p].l << ' ' << a[p].r << ' ' << query(1, a[p].l, a[p].r) << " q\n";
                ++p;
            }
            add(i, 0);
            // print(1);cout << '\n';
        }
        solve(lid, l, mid);
    }
    void awa(){
        int n, m, q;
        cin >> n >> m >> q;
        build(1, 1, n);
        for (int i = 1;i <= m;i++){
            int a, b, c, d, x;
            cin >> a >> c >> b >> d >> x;
            md[a].emplace_back(c, d, x);
            md[b + 1].emplace_back(c, d, -x);
        }
        for (int i = 1;i <= n;i++) sort(md[i].begin(), md[i].end(), [](mod a, mod b){return a.x < b.x;});
        for (int i = 1;i <= q;i++){
            int a, b, c, d;
            cin >> a >> c >> b >> d;
            insert(1, 1, n, a, b, (que){c, d, a, b, i});
        }
        solve(1, 1, n);
        for (int i = 1;i <= q;i++) cout << ans[i] << '\n';
	}
}
signed main(){
	int T = 1;
	while (T--) tianyu::awa();
	return 0;
}
2025/7/22 11:33
加载中...