玄关求调!扫描线
查看原帖
玄关求调!扫描线
586417
Bz_nnn楼主2024/9/6 22:36

见我的测评记录

#include<bits/stdc++.h>
using namespace std;
const int N = 16e5 + 5;
int T, n, w, h, X[N];
struct Line{ int x1, x2, y, tag, val; }L[N];
struct Seg{ int l, r, val, cnt; }tr[N];
bool cmp(Line a, Line b){ return a.y < b.y; }
void build(int p, int s, int t){
    tr[p] = { s, t, 0, 0 };
    if(s == t) return;
    int mid = (s + t) / 2;
    build(p*2, s, mid);
    build(p*2+1, mid+1, t);
}
void pushup(int p, int v){
    if(tr[p].cnt) tr[p].val += v;
    else tr[p].val = max(tr[p*2].val, tr[p*2+1].val);
}
void modify(int p, int l, int r, int tag, int v){
    if(l > tr[p].r || r < tr[p].l) return;
    if(l <= tr[p].l && tr[p].r <= r){
        tr[p].cnt += tag;
        pushup(p, v);
        return;
    }
    modify(p*2, l, r, tag, v);
    modify(p*2+1, l, r, tag, v);
    pushup(p, v);
}
int main(){
    scanf("%d", &T);
    while(T--){
        int ans = 0;
        scanf("%d%d%d", &n, &w, &h);
        for(int i = 1; i <= n; i++){
            int x, y, v;
            scanf("%d%d%d", &x, &y, &v);
            X[i] = x; X[i+n] = x+w-1;
            L[i] = { x, x+w-1, y, 1, v };
            L[i+n] = { x, x+w-1, y+h-1, -1, -v };
        }
        sort(L+1, L+2*n+1, cmp);
        sort(X+1, X+2*n+1);
        int m = unique(X+1, X+2*n+1) - X-1;
        build(1, 1, m-1);
        for(int i = 1; i < 2*n; i++){
            int l = lower_bound(X+1, X+2*n+1, L[i].x1) - X;
            int r = lower_bound(X+1, X+2*n+1, L[i].x2) - X;
            modify(1, l, r-1, L[i].tag, L[i].val);
            ans = max(ans, tr[1].val);
        }
        printf("%d\n", ans);
    }
return  0;
}

我自己对右端点偏移映射不太确定,可能有错,望各位大佬指出orz

2024/9/6 22:36
加载中...