首页 > 其他分享 >Codeforces Beta Round #19 D. Points 线段树+set

Codeforces Beta Round #19 D. Points 线段树+set

时间:2023-02-28 09:34:05浏览次数:42  
标签:cnt set 19 Codeforces int ls ans lisan

给你一个笛卡尔坐标系,现在要支持三种操作,第一种操作是添加一个点(x,y),第二种操作是删除一个点(x,y), 第三种操作是查询严格在点(x,y)右上角的点中,横坐标最小的点,如果有多个点,选择纵坐标最小的那个。

--------

首先肯定离散化

然后考虑怎么用线段树表示二维的信息,觉得树套树也可以写,但是线段树套set更好写一点

以x为下标建立线段树,对每个叶子节点开一个set,表示x点有多少个y。

添加和查找只要递归到叶节点删去/增加就可以了

查找的话,要求严格在(x,y)右上

转化为代数也就是在(x+1,maxn)上找一个最小的下标满足该下标能顶到的最大值>y;

最小下标只要优先递归左子树就能满足;

找到后在set内upper_bound即可;

 

#include<bits/stdc++.h>
#define ls (rt<<1)
#define rs (rt<<1|1)
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int maxn=4e5+5;
int n;
int op[maxn],x[maxn],y[maxn],lisan[maxn<<1];
struct seg{
    int l,r,mx;
}t[maxn<<2];
set<int>s[maxn<<2];
void push_up(int rt){
    t[rt].mx=max(t[ls].mx,t[rs].mx);
}
void build(int rt,int l,int r){
    t[rt].l=l;t[rt].r=r;
    if(l==r){
       t[rt].mx=-1;
       return;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid);build(rs,mid+1,r);
}
void update(int rt,int l,int r,int val,int type){
    //cout<<rt<<" "<<t[rt].l<<" "<<t[rt].r<<" "<<l<<" "<<r<<" "<<val<<" "<<type<<endl;
    if(l<=t[rt].l&&t[rt].r<=r){
        // update
        if(type==0){
            s[rt].erase(val);
            if(s[rt].empty()) t[rt].mx=-1;
            else t[rt].mx=*s[rt].rbegin();
        }
        else {
            s[rt].insert(val);
            t[rt].mx=*s[rt].rbegin();
        }
        return;
    }
    if(t[ls].r>=l) update(ls,l,r,val,type);
    if(t[rs].l<=r) update(rs,l,r,val,type);
    push_up(rt);
}
int Ansx=0;
int query(int rt,int l,int r,int y){
    //cout<<":: "<<rt<<" "<<t[rt].l<<" "<<t[rt].r<<" "<<l<<" "<<r<<" "<<y<<" "<<t[rt].mx<<endl;
    if(l>r) return 0;
    if(l<=t[rt].l&&t[rt].r<=r){
        if(t[rt].mx<=y) return 0;
    }
    if(t[rt].l==t[rt].r){
        if(t[rt].mx<=y) return 0;
        else {
           Ansx=t[rt].l;
           return *s[rt].upper_bound(y);    
        }
    }
    int ans=0;
    if(t[ls].r>=l&&t[ls].mx>y) ans=query(ls,l,r,y);
    if(ans) return ans;
    if(t[rs].l<=r&&t[rs].mx>y) ans=query(rs,l,r,y);
    return ans;
}
int cnt=0;
int id(int x){
    return lower_bound(lisan+1,lisan+cnt+1,x)-lisan;
}
int main(){
    //freopen("lys.in","r",stdin);
    fastio;
    cin>>n;
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        if(s[0]=='a') op[i]=1;
        if(s[0]=='f') op[i]=2;
        cin>>x[i]>>y[i];
        lisan[++cnt]=x[i];
        lisan[++cnt]=y[i];
    }
    sort(lisan+1,lisan+cnt+1);
    cnt=unique(lisan+1,lisan+cnt+1)-(lisan+1);
    build(1,1,cnt);
    for(int i=1;i<=n;i++){
        if(op[i]==0){
            //remove
            update(1,id(x[i]),id(x[i]),y[i],0);
        }
        else if(op[i]==1){
            //add    
            update(1,id(x[i]),id(x[i]),y[i],1);
        }
        else {
            //find
            int out=query(1,id(x[i])+1,cnt,y[i]);
            if(out==0) cout<<-1<<endl;
            else cout<<lisan[Ansx]<<" "<<out<<endl;
        }
    }
}

 

标签:cnt,set,19,Codeforces,int,ls,ans,lisan
From: https://www.cnblogs.com/liyishui2003/p/17162780.html

相关文章

  • Educational Codeforces Round 25
    EducationalCodeforcesRound25https://codeforces.com/contest/825ABCD没有什么意思,阅读理解题比较无聊(((EFG不难写,但是思维比较巧,知道就是知道,不知道就写不出emmA.B......
  • 【比赛记录】 Codeforces Round #682 Div.2
    Problems:#NameSubmitASpecificTastesofAndreBValeriiAgainstEveryoneCEngineerArtemDPowerfulKseniaEYuriiCanDoEverything......
  • Codeforces Round #111 (Div. 2) E. Buses and People 线段树|多维限制|离散化
    一看发现要求满足3个条件,有点头大可以先把所有的bus和people拎出来,用bus的s和people的l去排序,这样能保证对于当前的people,si都合法。然后考虑如何满足ti最小的情况下,使得......
  • 2023-02-13 Set `"volar.inlayHints.eventArgumentInInlineHandlers": false` to hide
    Set`"volar.inlayHints.eventArgumentInInlineHandlers":false`tohideEventArgumentinInlineHandlers.设置`“volar.inlayHints.eventArgumentInInlineHandlers......
  • 力扣中19 删除链表的倒数第N个节点
     就是双指针移动呢忽略了特殊情况的判断有可能是设置的标记倒数第n个节点的指针还没移动呢形如例子【1,2  n=2】或者链表很短都不存loc下下个元素会找不到溢出......
  • 我终于搞懂了async/await、promise和setTimeout的执行顺序
    从一道题目出发今天看到一道面试题,是关于async/await、promise和setTimeout的执行顺序,题目如下:asyncfunctionasync1(){console.log('async1start');awaitasync2(......
  • ARC156F Make Same Set 解题报告
    题意:给定长度为\(N\)的序列\(A,B,C\)。构造最大的集合\(S\),满足:对每个\(j\),在\(A_j\)与\(B_j\)中选择其一,能得到集合\(S\)。对每个\(j\),在\(A_j\)与\(C......
  • 【题解】CTT 2019 Day 2
    目录A.循环序列B.MatrixC.杀蚂蚁简单版A.循环序列即求\(\sum\limits_{i=0}^{c}{k\choosem+in}\),即\(\frac{1}{n}\sum\limits_{j=0}^{n-1}\sum\limits_{i=0}^{k-m}......
  • 【题解】CTT 2019 Day 1
    目录A.递增树列B.异世界的文章分割者C.时间旅行A.递增树列令\(f_{u,i}\)表示\(u\)的子树,已经用掉\(i\)个点,剩下的点排列满足要求的方案数。考虑方案的计算,用......
  • Codeforces Global Round 15 CF1552 A~G 题解
    点我看题对两三年前的cf进行考古的时候偶然做到这场,像这种全是构造题和思维题的比赛还是比较少见的。题目本身很有意思,但是对于现场打比赛想上分的人来说体验就比较差了。......