线段树加错点怎么办
查看原帖
线段树加错点怎么办
551088
FincheuwYggdrasil楼主2022/12/25 15:48

rt,站外题,这个

#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;
}tree[MAXN << 2];
void lazy(int k)
{
	tree[k].mx += 1;
} 
void build(int k,int l,int r)
{
	tree[k].l = l;
	tree[k].r = r;
	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 print(int k)
{
	if(tree[k].l && tree[k].r)
	{
		cout << k << " " << tree[k].l << " " << tree[k].r << " " << tree[k].mx << endl;
		print(k << 1);
		print((k << 1) + 1);
	}
}
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];
		}
		sort(tmp,tmp+cnt);
		cnt = unique(tmp,tmp+cnt)-tmp;
		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++)
		{	//cout << "e:" << newl[i] << " " << newr[i] << endl;
			update(1,newl[i],newr[i]);
		}
		//print(1);
		printf("/*out :*/%d\n",query(1,1,n));
	}
 	return 0;
}

悬赏一关注球球了

2022/12/25 15:48
加载中...