ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

codeforces 19D

2019-09-26 21:38:50  阅读:224  来源: 互联网

标签:return ve int end tree codeforces 19D left


题意:

n个操作,在200000*200000的平面上加删点

find 严格在坐标右上角,x最小,再y最小的点

思路:线段树套set,注意这种线段树二分的复杂度也是log。

#include <bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
#define lc l,mid,x<<1
#define rc mid+1,r,x<<1|1
using namespace std;
const int maxn = 200005;
const int inf = 0x3f3f3f3f;
multiset<int> se[maxn];
int tree[4*maxn];
vector<int> ve;
void discrete(){
    sort( ve.begin(),ve.end() );
    ve.erase( unique( ve.begin(),ve.end() ),ve.end() );
}
int H( int x ){
    return lower_bound( ve.begin(),ve.end(),x ) -ve.begin()+1;
}
void push_up( int x ){
    tree[x] = max(tree[ls] , tree[rs]);
}
void build( int l,int r,int x ){
    if( l == r ){
        tree[x] = -inf;
        return;
    }
    int mid = l+r>>1;
    build(lc);
    build(rc);
    push_up(x);
}
void update( int left,int right,int v,int l,int r,int x ){
    if( left <= l && right >= r ) {
        tree[x] = v;
        return;
    }
    int mid = l+r >>1;
    if(left <= mid)update( left,right,v,lc );
    else update( left,right,v,rc );
    push_up(x);
}
int query( int left,int right,int v,int l,int r,int x ){
    if( l == r ){
        if( tree[x] > v ) return l;
        else return -1;
    }
    if( tree[x] <= v ) return -1;
    int mid = l+r>>1;
    int res=-1;
    if( left <= mid ){
        res = query( left,right,v,lc );
    }
    if( res == -1 && right > mid ){
        res = query( left,right,v,rc );
    }
    return res;
}
struct Q{
    char c;
    int x,y;
    Q( char _c,int _x,int _y ){
        c = _c;x = _x;y = _y;
    }
};
vector<Q> v;
int main(){
    char ss[10];
    int n,x,y;scanf("%d",&n);
    for( int i = 1;i <= n;i++ ){
        scanf("%s%d%d",ss,&x,&y);
        ve.push_back(x);
        v.push_back( Q( ss[0],x,y ) );
    }
    discrete();
    build( 1,ve.size(),1 );
    for( int i = 0;i < v.size();i++ ){
        int x = H( v[i].x ),y = v[i].y;char c = v[i].c;
        if( c=='a'){
            se[x].insert( y );
            auto p = se[x].end();--p;
            update( x,x,*p,1,n,1 );
        }else if( c == 'r' ){
            se[x].erase(y);
            auto p = se[x].end();
            if( se[x].size() ) {
                --p;
                update(x, x, *p, 1, n, 1);
            }else  update(x, x,-inf , 1, n, 1);
        }else if( c=='f' ){
            if(x < ve.size() )
            x = query( x+1,ve.size(),y,1,n,1 );
            else x = -1;
            if( x == -1 ){
                puts("-1");
                continue;
            }
            auto p = se [x].upper_bound( y );
            if( p == se[x].end() ){
                puts("-1");
                continue;
            }
            printf("%d %d\n",ve[x-1],*p);
        }
    }
    return 0;
}
/*
 * 13
find 0 0
add 0 0
find 0 0
add 1 2
add 1 3
add 1 10
add 10 5
add 2 1
find 0 1
find 0 2
remove 1 10
remove 1 3
find 0 2
 */

 

标签:return,ve,int,end,tree,codeforces,19D,left
来源: https://blog.csdn.net/ehdhg13455/article/details/101478123

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有