ICode9

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

「JOISC 2016 Day 1」俄罗斯套娃(二维偏序)

2022-08-28 14:04:12  阅读:179  来源: 互联网

标签:偏序 node 套娃 JOISC return 2016 Day


「JOISC 2016 Day 1」俄罗斯套娃
思路清奇的呀,先在坐标轴上画图(R为横坐标,H为纵坐标),然后发现每个询问之间没有影响,考虑离线处理,因为询问的要求是选择>=R的,所以把横坐标从大到小排序,二维偏序?,那么在H对应的纵坐标上画一条线,就发现是在这以下的娃娃都满足,然后就树状数组维护不可以套起来的,可以画图理解,就是一个娃娃右上方的,答案是所有不能连接的形成的链的最大值,注意一下更新方式,因为最外面的娃娃也算没有套的,所以就是最大值(真一开始没想通)

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y,id;/*直径,高度*/
}a[400010];
int cmp(node x,node y){
	if(x.x!=y.x)return x.x>y.x;
	if(x.y!=y.y)return x.y<y.y;
	return x.id<y.id;
}
int tree[400010],l[800010];
int find(int x,int le,int ri){
	int ans=0;
	while(le<=ri){
		int mid=le+ri>>1;
		if(l[mid]<=x)ans=mid,le=mid+1;
		else ri=mid-1;
	}
	return ans;
}
int ans[200010],nn;
void add(int x,int val){
	for(;x<=nn;x+=x&-x)tree[x]=max(tree[x],val);
}
int qu(int x){
	int ans=0;
	for(;x;x-=x&-x)ans=max(ans,tree[x]);
	return ans;
}
int main(){
	int n,q;
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y),a[i].id=0,l[i*2-1]=a[i].x,l[i*2]=a[i].y;
	for(int i=1;i<=q;i++)scanf("%d%d",&a[i+n].x,&a[i+n].y),a[i+n].id=i,l[(i+n)*2-1]=a[i].x,l[(i+n)*2]=a[i].y;
	sort(l+1,l+(q+n)*2+1);
	for(int i=1;i<=(n+q)*2;i++)if(l[i]!=l[i-1])l[++nn]=l[i];
	sort(a+1,a+1+n+q,cmp);//R从大到小 
	for(int i=1;i<=q+n;i++){
		int r=find(a[i].x,1,nn),h=find(a[i].y,1,nn);
		if(!a[i].id)add(h,qu(h)+1/*注意不是加一*/);
		else ans[a[i].id]=qu(h);
	}
	for(int i=1;i<=q;i++)printf("%d\n",ans[i]);
	return 0;
}

标签:偏序,node,套娃,JOISC,return,2016,Day
来源: https://www.cnblogs.com/lefy959/p/16632636.html

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

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

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

ICode9版权所有