• [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
    ",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
  • 相关阅读:
    [原创]ASP.NET MVC调用美图秀秀开放平台拼图实现
    使用Lucene检索文档中的关键字
    Unitils+hibernate+Spring+PostgreSql做dao层测试遇到的错误
    初探IronJS
    IntelliJ IDEA 12 创建Web项目 教程 超详细版
    百度面试题:求绝对值最小的数
    jquery+css实现简单的评分功能
    Knockot JS 数字输入插件
    Diagnostic Policy Service 服务处于起不来
    WCF学习笔记(一) 之 开门见山
  • 原文地址:https://www.cnblogs.com/cjbiantai/p/9343060.html
Copyright © 2020-2023  润新知