首页 > 其他分享 >[题解] CF19D Points

[题解] CF19D Points

时间:2024-07-12 15:56:05浏览次数:12  
标签:cnt CF19D int 题解 len leq Points

[题解] CF19D Points

CF19D Points

在一个笛卡尔坐标系中,定义三种操作:

  1. add x y:在坐标系上标记一个点 \((x, y)\),保证 \((x, y)\) 在添加前不在坐标系上。

  2. remove x y:移除点 \((x, y)\),保证 \((x, y)\) 在移除前已在坐标系上。

  3. find x y:找到所有已标记的 \((x', y')\),需满足 \(x' > x\),\(y' > y\),输出其中 \(x'\) 最小的点。如果答案不唯一,则取 \(y'\) 最小的点。如果没有满足要求的 \((x', y')\),输出 \(-1\)。

现给定 \(n\) 个操作,对于每个 find 操作,输出结果。

数据保证 \(n \leq 2 \times 10^5\),\(0 \leq x, y \leq 10^9\)。

\(0 \leq x, y \leq 10^9\)?离散化取之!

添加删除一个点?set取之!

【操作三】?线段树套set取之!

离散化后,线段树套set,在外层线段树上二分找答案(查询时分讨一下)即可!

CODE:

int n;

struct node{
	string s;
	int x,y;
};node q[N<<1];

int b[N<<1],len,cnt;

set<int> s[N<<1];

int tree[N<<3];

void modify(int p,int l,int r,int pos,int val){
	if(l==r){
		tree[p]=val;
		return ;
	}
	int mid=(l+r)>>1;
	if(pos<=mid){
		modify(p<<1,l,mid,pos,val);
	}
	else{
		modify(p<<1|1,mid+1,r,pos,val);
	}
	tree[p]=max(tree[p<<1],tree[p<<1|1]);
}

int query(int p,int l,int r,int x,int y,int val){
	if(tree[p]<=val || y<l || x>r){
		return -1;
	}
	if(l==r){
		return l;
	}
	int mid=(l+r)>>1;
	int res=query(p<<1,l,mid,x,y,val);
	if(~res){
		return res;
	}
	return query(p<<1|1,mid+1,r,x,y,val);
}

inline void solve(){
	ios::sync_with_stdio(NULL);
	cin.tie(NULL),cout.tie(NULL);
	cin>>n;
	rep(i,1,n,1){
		cin>>q[i].s>>q[i].x>>q[i].y;
		b[++cnt]=q[i].x;
		b[++cnt]=q[i].y;
	}
	sort(b+1,b+cnt+1);
	len=unique(b+1,b+cnt+1)-b-1;
	rep(i,1,n,1){
		q[i].x=lower_bound(b+1,b+len+1,q[i].x)-b;
		q[i].y=lower_bound(b+1,b+len+1,q[i].y)-b;
	}
	rep(i,1,n,1){
		if(q[i].s[0]=='a'){
			s[q[i].x].insert(q[i].y);
			modify(1,1,len,q[i].x,*(--s[q[i].x].end()));
		}
		else{
			if(q[i].s[0]=='r'){
				s[q[i].x].erase(q[i].y);
				if(!s[q[i].x].size()){
					modify(1,1,len,q[i].x,0);
				}
				else{
					modify(1,1,len,q[i].x,*(--s[q[i].x].end()));
				}
			}
			else{
				int pos=query(1,1,len,q[i].x+1,len,q[i].y);
				if(pos==-1){
					cout<<-1<<'\n';
				}
				else{
					cout<<b[pos]<<" "<<b[*s[pos].upper_bound(q[i].y)]<<'\n';
				}
			}
		}
	}
}

标签:cnt,CF19D,int,题解,len,leq,Points
From: https://www.cnblogs.com/Underage-potato/p/18298550

相关文章

  • CLOI Round 2 D题题解
    一份简单的美术作业(Art)题意:给你一棵树,树上\(n\)个节点和\(n-1\)条边,每个点有一个权值,每两个黑点之间必须间隔至少一个白点,求黑点权值总和最大值,并且输出任意一种达成最大值的取点合法方案。sol:对于第一问,采用树形dp。定义\(f_{i,0/1}\)为当前节点为\(i\),当前点取或不......
  • P1262 间谍网络 题解
    题目描述给你一个有向图,可以付出代价获取一些指定的点。在获取之后要求能以获取的点为出发点,将整个图都访问到,求最小的代价。思路既然需要令总的代价最少,那么如果通过买一个点就可以访问到的所有点,自然会比买两个点的方案更优。于是自然的就可以联想到可以将图划分成很多个强......
  • [ABC328D] Take ABC 题解
    题目翻译题目描述给你一个字符串\(S\)包含A、B和C三个不用的字符。只要字符串\(S\)中包含连续的ABC就将ABC删除掉再字符串\(S\)不能操作之后输出这个字符串限制\(S\)的长度小于\(2\times10^5\)思路1总结一下这道题目的操作,可以发现就是将字符串删除一......
  • [HNOI2005] 狡猾的商人's 题解
    题目描述给你一个\(n\)元一次方程,判断是否有解,方程给出的格式为\(a-b=c\)思路这道题看上去是一道题目看上去就是判断给出条件是否有矛盾,所以就自然而然的可以使用带权并查集但是因为我太懒了并且这道题目要求使用差分约束系统进行求解,于是就需要将题目转化一下因为差分约束......
  • Ubuntu系统下相关问题解决方案(亲测)
    系统:ubuntu20.04记录使用ubuntu系统过程中遇到的一些问题以及亲测有效的解决方案后续遇到其他问题,会将相关内容持续更新对应原文:Ubuntu系统下相关问题解决方案(亲测)-知乎(zhihu.com)目录一、速度问题1.1gitcloneGithub上的项目时速度慢1.2ubuntu下设置pip加速1.......
  • [CF1656G] Cycle Palindrome 的题解
    题目大意给定一个长度为\(n\)的数列\(a\),要求求出一个排列\(p\)满足\(a_{p_1},a_{p_2},\cdots,a_{p_n}\)是一个回文字符串而且把\(i\)向\(p_i\)连边得到的图中只有一个环。数据范围满足,\(1\le\sumn\le2\times10^5\)。思路先不考虑\(p\)是否构成满足要求的环......
  • [CF1646F] Playing Around the Table 的题解
    题目大意有\(n\)种牌,一种\(n\)张,一共\(n\)个玩家,一人\(n\)个。每个人一次将一张牌对给下家,求构造方案使可以在\(n\cdot(n-1)\)次操作之内使第\(i\)个人拥有\(n\)张\(i\)。数据范围满足,\(1\len\le100\)。思路因为直接构造出题目要求的情况会出现如果一个人提......
  • 2022 RoboCom CAIP(本科组)国赛个人题解
    RC-u1智能红绿灯为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。这个红绿灯是这样设计的:路的两旁设置了一个按钮,老年人希望通行马路时会按下按钮;在没有人按按钮的时候,红绿灯一直为绿灯;当红绿灯为绿灯时,有人按下按钮,第一次按下......
  • CF1992场题解
    OnlyPluses算法:数学。题意简述:有三个数,每次选择一个数\(x\),使得\(x\)增加一,至多操作\(5\)次,最后求出这三个数的乘积最大值。简单题,一眼秒了。考虑把这\(3\)个数从小到大排序,显然加最小的数比加其他的数更优。简单证一下:设排序后的三个数为\(a,b,c\),有\(b\timesc\ge......
  • upload-labs靶场全题解
    ​​靶场搭建对php和apache版本有严格要求,建议使用phpstudy2018并且使用设置php版本为5.2.17,这个靶场比较老了,如果要复现的话,必要严格按照要求来使用,博主使用最新版的phpstudy在某些靶场上未能成功复现,所以浪费了很多时间。。。。。Upload-Labs环境要求操作系统:wind......