区间最大值-杭电5124

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 200005
using namespace std;
int sum[maxn<<2];
int col[maxn<<2];
struct node
{
	int id,x;
}a[maxn];
int num[maxn/2][2];
bool cmp(node X,node Y)
{
	return X.x<Y.x;
}
void down(int rt)
{
	if(col[rt]!=0)
	{
		col[rt<<1]+=col[rt];
		sum[rt<<1]+=col[rt];
		col[rt<<1|1]+=col[rt];
		sum[rt<<1|1]+=col[rt];
		col[rt]=0; 
	}
}
void up(int rt)
{
	sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void update(int L,int R,int rt,int a,int b)
{
	if(a<=L&&b>=R)
	{
		col[rt]+=1;
		sum[rt]+=1;
		return;
	}
	down(rt);
	int m=(L+R)/2;
	if(a<=m)update(L,m,rt<<1,a,b);
	if(b>m) update(m+1,R,rt<<1|1,a,b);
	up(rt);
}
int main()
{
	int T,N,i,j,temp,sum1;
	scanf("%d",&T);
	while(T--)
	{
		memset(sum,0,sizeof(sum));
		memset(col,0,sizeof(col));
		scanf("%d",&N);
		for(i=0;i<N;i++)
		{
			scanf("%d %d",&num[i][0],&num[i][1]);
			a[2*i].x=num[i][0];
			a[2*i].id=-i-1;
			a[2*i+1].x=num[i][1];
			a[2*i+1].id=i+1;
		}
		sort(a,a+2*N,cmp);
		sum1=a[0].x;
		temp=1;
		for(i=0;i<2*N;i++)
		{
			if(sum1!=a[i].x)
			{
				temp++;
				sum1=a[i].x;
			}
			if(a[i].id<0)
			{
			num[-a[i].id-1][0]=temp;
			}
			else 
			{
			num[a[i].id-1][1]=temp;
			}
		}
		for(i=0;i<N;i++)
		{
			update(1,temp,1,num[i][0],num[i][1]);
		}
		printf("%d\n",sum[1]);
	}
return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值