[Codeforces19D]Points 线段树

大致题意:

  给出n个询问,每次询问有三种:

    1、往平面上加一个点

    2、删除平面上的一个点

    3、给出一个点p,查询平面上某点q,使得q.x>p.x且q.y>p.y,输出x轴坐标最小的q,若有多个,输出y最小的

    

    点的坐标较大,需要先离散点坐标,线段树维护x坐标对应的最大的y坐标,

    查询用线段树定位x坐标,用set数组查询y坐标即可,因为总共只会用2e5个点,不会超内存

   

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<set>
  7 #include<map>
  8 #include<stack>
  9 #include<time.h>
 10 #include<cstdlib>
 11 #include<cmath>
 12 #include<list>
 13 using namespace std;
 14 #define MAXN 200100
 15 #define eps 1e-7
 16 #define For(i,a,b) for(int i=a;i<=b;i++)
 17 #define Fore(i,a,b) for(int i=a;i>=b;i--)
 18 #define lson l,mid,rt<<1
 19 #define rson mid+1,r,rt<<1|1
 20 #define mkp make_pair
 21 #define pb push_back
 22 #define cr clear()
 23 #define sz size()
 24 #define met(a,b) memset(a,b,sizeof(a))
 25 #define iossy ios::sync_with_stdio(false)
 26 #define fre freopen
 27 #define pi acos(-1.0)
 28 #define inf 1e9+9
 29 #define Vector Point
 30 const int Mod=1e9+7;
 31 typedef unsigned long long ull;
 32 typedef long long ll;
 33 struct Point {
 34     int x,y;
 35     int mk,id;
 36     bool operator < (const Point &a)const{
 37         if(x==a.x) return y<a.y;
 38         return x<a.x;
 39     }
 40     bool operator == (const Point &a)const{
 41         return x==a.x && y==a.y;
 42     }
 43     void read(int idd,int mkk) {
 44         scanf("%d%d",&x,&y);
 45         id=idd;mk=mkk;
 46     }
 47 };
 48 bool cmp(Point a,Point b){
 49     return a.id<b.id;
 50 }
 51 Point ad[MAXN];
 52 int add[MAXN];
 53 int t[MAXN<<2];
 54 set<int>mp[MAXN];
 55 set<int>::iterator it;
 56 void up(int rt){
 57     t[rt]=max(t[rt<<1],t[rt<<1|1]);
 58 }
 59 void Change(int x,int l,int r,int rt){
 60     if(l==r && r==x){
 61         if(mp[x].size()==0){
 62             t[rt]=0;
 63             return ;
 64         }
 65         t[rt]=(*mp[x].rbegin());
 66         return ;
 67     }
 68     int mid=l+r>>1;
 69     if(x<=mid) Change(x,lson);
 70     else Change(x,rson);
 71     up(rt);
 72 }
 73 int Query(int x,int xx,int l,int r,int rt){
 74     int mid=l+r>>1;
 75     if(l>=xx) {
 76         if(t[rt]>x){
 77             if(l==r) return l;
 78             else {
 79                 if(t[rt<<1]>x) return Query(x,xx,lson);
 80                 else if(t[rt<<1|1]>x) return Query(x,xx,rson);
 81             }
 82         }else return inf;
 83             
 84     }else{
 85         int res=inf;
 86         if(xx<=mid) res=Query(x,xx,lson);
 87         if(res!=inf) return res;
 88         return Query(x,xx,rson);
 89     }
 90 }
 91 int n,cnt;
 92 char s[20];
 93 void solve(){
 94     scanf("%d",&n);
 95     cnt=0;
 96     For(i,1,n){
 97         scanf("%s",s);    
 98         if(s[0]=='a') ad[i].read(i,1);
 99         else if(s[0]=='r') ad[i].read(i,2);
100         else ad[i].read(i,3);
101         add[i]=ad[i].x;
102     }
103     cnt=n;
104     sort(add+1,add+n+1);
105     cnt=unique(add+1,add+1+cnt)-(add+1);
106     For(i,1,n){
107         int idx=upper_bound(add+1,add+1+cnt,ad[i].x)-(add+1);
108         if(ad[i].mk==1) {
109             mp[idx].insert(ad[i].y);
110             Change(idx,1,cnt,1);
111         }
112         else if(ad[i].mk==2) {
113             mp[idx].erase(ad[i].y);
114             Change(idx,1,cnt,1);
115         }
116         else {
117             int ans=Query(ad[i].y,idx+1,1,cnt,1);
118             if(ans==inf) {puts("-1");continue;}
119             it=mp[ans].upper_bound(ad[i].y);
120             if(it==mp[ans].end()) {puts("-1");continue;}
121             printf("%d %d\n",add[ans],(*it));
122         }
123     }
124 }
125 int main(){
126 //  fre("in.txt","r",stdin);
127     int t=0;
128     solve();
129     return 0;
130 }
View Code

猜你喜欢

转载自www.cnblogs.com/cjbiantai/p/9343060.html