.CodeforcesBeta Round #19 D. Points 线段树 单点更新

原创 2016年05月31日 01:19:53

题意:三个操作均在二维坐标轴上进行 Add(x,y)加入一个点 remove移出一个点 find寻找最小的坐标严格大于当前点的坐标 没有输出-1 x优先级大于y

题解:因为是在二维坐标轴上操作所以可以将所有操作按照x轴排序,然后把x轴坐标当成线段树的区间,y区间当做线段树权值,线段树记录当前线段最大y值,这样一来query就和常规线段树不太一样

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const int N=200010;
int flag[N],tree[N<<3];
struct point
{
    int x,y;
    bool operator < (const point& a)const{
        if(x!=a.x)return x<a.x;
        return y<a.y;
    }
}a[N],x[N],ans,null;
void pushup(int rt)//tree记录的是线段树中线段的最大值
{
    tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
}
void update(bool f,int X,int p,int l,int r,int rt)//找到X的位置并更新y的值
{
    if(l==r){tree[rt]=f?p:-1;return;}
    int mid=(l+r)>>1;
    if(X<=mid) update(f,X,p,lson);
    else update(f,X,p,rson);
    pushup(rt);
}
void query(point p,int l,int r,int rt)//query和常规线段树不太一样
{
    if(x[r].x<=p.x||tree[rt]<=p.y)return;
    if(l==r)ans=x[l];
    int mid=(l+r)>>1;
    query(p,lson);
    if(ans.x==-1)query(p,rson);
}
int main()
{
    memset(tree,-1,sizeof(tree));
    int n,m=0;
    null.x=null.y=-1;
    char op[10];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s%d%d",op,&a[i].x,&a[i].y);
        if(op[0]=='a') x[m++]=a[i],flag[i]=1;
        else if(op[0]=='f') x[m++]=a[i],flag[i]=2;
        else flag[i]=0;
    }
    sort(x,x+m);
    for(int i=0;i<n;i++){
        int now=lower_bound(x,x+m,a[i])-x;//找查询的x在x数组中的位置
        if(flag[i]<2)update(flag[i],now,a[i].y,0,m-1,1);//更新
        else{
            ans=null;
            query(a[i],0,m-1,1);
            if(ans.x==-1) puts("-1");
            else printf("%d %d\n",ans.x,ans.y);
        }
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Beta Round #19D. Points

链接:http://www.codeforces.com/contest/19/problem/D 题意:给定n个操作,add x y:在平面坐标系中[x,y]位置插入一个点,remove x y:...
  • Fsss_7
  • Fsss_7
  • 2016年04月27日 20:09
  • 525

CodeforcesBeta Round #19 D. Points(线段树)

有三种操作“add x y”往平面上添加(x,y)这个点,"remove x y",将平面上已经存在的点(x,y)删除,“find x y”找出平面上坐标严格大于(x,y)的点,如果有多个点找x最小的...
  • u012962816
  • u012962816
  • 2014年11月11日 17:12
  • 543

【Codeforces Beta Round #19】Codeforces 19E Fairy

dfs+差分
  • sdfzyhx
  • sdfzyhx
  • 2016年12月03日 20:08
  • 363

CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化

题目链接:http://codeforces.com/contest/19/problem/D题意:有三种操作“add x y”往平面上添加(x,y)这个点,”remove x y”,将平面上已经存在...
  • yxg_123
  • yxg_123
  • 2017年03月24日 19:39
  • 91

CodeforcesBeta Round #19 D. Points (线段树)

题目链接:点这里!!!! 题意: 有三种操作“add x y”往平面上添加(x,y)这个点,"remove x y",将平面上已经存在的点(x,y)删除,“find x y”找出平面上坐标...
  • u014325920
  • u014325920
  • 2016年05月05日 20:27
  • 152

线段树二维转一维CodeforcesBeta Round #19 D. Points(好)

具体看代码和注释:
  • u010660276
  • u010660276
  • 2014年07月19日 20:13
  • 399

线段树之建树,单点更新以及区间查询

线段树之建树,单点更新以及区间查询       线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。      使用线段树可以快速的查找某一个节...
  • ruangongshi
  • ruangongshi
  • 2015年08月09日 11:07
  • 1644

hihocoder算法复习之 线段树单点更新

hihocoder #1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB ...
  • u013497977
  • u013497977
  • 2015年11月16日 18:45
  • 325

线段树详解(单点更新与成段更新\区间更新操作)

本文纯属原创,转载请注明出处,谢谢。 距离第一次接触线段树已经一年多了,再次参加ACM暑假集训,这一次轮到我们这些老家伙们给学弟学妹们讲解线段树了,所以就自己重新把自己做过的题目看了一遍,然后写篇博客...
  • u014705673
  • u014705673
  • 2015年07月06日 15:57
  • 6524

Codeforces Beta Round #19 D. Points

Description Pete and Bob invented a new interesting game. Bob takes a sheet of paper and locates ...
  • Kirito_Acmer
  • Kirito_Acmer
  • 2015年07月21日 20:58
  • 606
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.CodeforcesBeta Round #19 D. Points 线段树 单点更新
举报原因:
原因补充:

(最多只允许输入30个字)