19D Points (線段樹+set)
阿新 • • 發佈:2019-02-09
離線,首先要離散化,對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 */