1. 程式人生 > >19D Points (線段樹+set)

19D Points (線段樹+set)

離線,首先要離散化,對x座標建立線段樹,維護區間內y座標的最大值,每一個x座標建立一個set

#include <bits/stdc++.h>
#define lson num << 1
#define rson num << 1 | 1
using namespace std;
const int MAXN = 2e5 + 10;
struct node
{
    int l,r,y;
}tree[MAXN << 2];
set<int> st[MAXN];
int x[MAXN],y[MAXN];
int X[MAXN];
char op[MAXN][20];
void pushup(int num)
{
    tree[num].y = max(tree[lson].y,tree[rson].y);
}
void build(int num,int l,int r)
{
    tree[num].l = l;
    tree[num].r = r;
    tree[num].y = -1;
    if(l == r) return;
    int mid = (l + r) >> 1;
    build(lson,l,mid);
    build(rson,mid + 1,r);
}
void update(int num,int pos)
{
    if(tree[num].l == tree[num].r) {
        if(!st[pos].empty()) tree[num].y = *(--st[pos].end());
        else tree[num].y = -1;
        return;
    }
    int mid = (tree[num].l + tree[num].r) >> 1;
    if(pos <= mid) update(lson,pos);
    else update(rson,pos);
    pushup(num);
}
int query(int num,int qx,int qy)
{
    if(tree[num].r <= qx) return -1;
    if(tree[num].y <= qy) return -1;
    if(tree[num].l == tree[num].r) return tree[num].l;
    int temp = query(lson,qx,qy);
    if(temp == -1) temp = query(rson,qx,qy);
    return temp;
}
int main(void)
{

    int n;
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) {
        scanf("%s %d %d",op[i],&x[i],&y[i]);
        X[i] = x[i];
    }
    sort(X + 1,X + 1 + n);
    int cnt = unique(X + 1,X + 1 + n) - (X + 1);
    build(1,1,cnt);
    for(int i = 1; i <= n; i++) {
        int posx = upper_bound(X + 1,X + 1 + cnt,x[i]) - (X + 1);
        if(op[i][0] == 'a') {
            st[posx].insert(y[i]);
            update(1,posx);
        }
        else if(op[i][0] == 'r') {
            st[posx].erase(y[i]);
            update(1,posx);
        }
        else {
            int ans = query(1,posx,y[i]);
            if(ans == -1) printf("-1\n");
            else printf("%d %d\n",X[ans],*st[ans].upper_bound(y[i]));
        }
    }
    return 0;
}
/*
7
add 1 1
add 3 4
find 0 0
remove 1 1
find 0 0
add 1 1
find 0 0
*/