站外题求助
查看原帖
站外题求助
551088
FincheuwYggdrasil楼主2022/12/23 20:23

RT, 悬赏1关注,样例输入得7(两个都是(悲

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
const int INF = 0x7fffffff;
int n,T;
struct node{
	int l,r,mx,lz;
}tree[MAXN << 2];
void lazy(int k)
{
	tree[k].mx += 1;
} 
void pushdown(int k)
{
	lazy(2 * k);
	lazy(2 * k + 1);
} 
void build(int k,int l,int r)
{
	tree[k].l = l;
	tree[k].r = r;
	tree[k].lz = -1;
	if(l == r)
	{
		tree[k].mx = 0;
		return;
	}
	int mid,lc,rc;
	mid = (l + r) / 2; // 划分点 
	lc = k * 2; // 左孩子存储下标 
	rc = k * 2 + 1; // 右孩子存储下标
	build(lc,l,mid);
	build(rc,mid + 1,r);
	tree[k].mx = max(tree[lc].mx,tree[rc].mx);
} 
void update(int k,int l,int r)//将a[i]改为v
{
	if(tree[k].l >= l && tree[k].r <= r)
		return lazy(k);
	pushdown(k);
	int mid,lc,rc;
	mid = (tree[k].l + tree[k].r) / 2;
	lc = k * 2;
	rc = k * 2 + 1;
	if(l <= mid)
		update(lc,l,mid);
	if(r > mid)
		update(rc,mid + 1,r);
	tree[k].mx = max(tree[lc].mx,tree[rc].mx);
} 
int query(int k,int l,int r)// 求区间[l,r]的最值
{
	if(tree[k].l >= l && tree[k].r <= r)
		return tree[k].mx;
	pushdown(k);
	int mid,lc,rc;
	mid = (tree[k].l + tree[k].r) / 2;//划分点 
	lc = k * 2; // 左孩子存储下标 
	rc = k * 2 + 1; // 右孩子存储下标
	int Max = -INF;
	if(l <= mid)
		Max = max(Max,query(lc,l,mid));
	if(r > mid)
		Max = max(Max,query(rc,mid + 1,r));
	return Max;
} 
int main()
{
	scanf("%d",&T);
	for(int i = 1;i <= T;i++)
	{
		scanf("%d",&n);
		int newl[MAXN],newr[MAXN];
		int tmp[MAXN * 2],cnt = 0,maxr = -1; 
		for(int i = 0;i < n;i++)
		{
			scanf("%d%d",&newl[i],&newr[i]);
			tmp[cnt++] = newl[i];
			tmp[cnt++] = newr[i];
			maxr = max(newl[i],max(newr[i],maxr));
		}
		sort(tmp,tmp+cnt);
		//cnt = unique(olda+1,olda+1+cnt)-olda-1;
		for(int i = 0;i < n;i++)
		{
			newl[i] = lower_bound(tmp,tmp+cnt,newl[i]) - tmp + 1;
			newr[i] = lower_bound(tmp,tmp+cnt,newr[i]) - tmp + 1;
			maxr = max(newl[i],max(newr[i],maxr));
		}
		build(1,1,maxr);
		for(int i = 0;i < n;i++)
		{
			update(1,newl[i],newr[i]);
		}
		printf("%d\n",query(1,1,n));
	}
 	return 0;
}

2022/12/23 20:23
加载中...