UVALive 4108(维护区间内以h为最高长度的左右区间范围长度)

UVALive 4108

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e5+10;
struct node{
	int mx,col;
}tree[maxn<<2];
int n;
int ans=0;
void pushdown(int rt)
{
	if(tree[rt].col>=tree[rt<<1].col){
		tree[rt<<1].col=tree[rt].col;
	}
	if(tree[rt].col>=tree[rt<<1|1].col){
		tree[rt<<1|1].col=tree[rt].col;
	}
}
void update(int rt,int l,int r,int x,int y,int h)
{
	if(h<tree[rt].col){
		return ;
	}
	if(x<=l&&y>=r&&h>=tree[rt].mx){
		tree[rt].mx=tree[rt].col=h;
		ans+=(r-l+1);
		return; 
	}
	else{
		pushdown(rt);
		int mid=(l+r)>>1;
		if(x<=mid){
			update(rt<<1,l,mid,x,y,h);
		}
		if(y>mid){
			update(rt<<1|1,mid+1,r,x,y,h);
		}
		tree[rt].mx=max(tree[rt<<1].mx,tree[rt<<1|1].mx);
	}
}
int main() 
{
    int T;
    scanf("%d",&T);
    while(T--){
       scanf("%d",&n);
       memset(tree,0,sizeof(tree));
       LL res=0;
	   for(int i=1;i<=n;i++){
	   	int l,r,h;
	   	scanf("%d%d%d",&l,&r,&h);
	   	r--;
	   	ans=0;
	   	update(1,1,1e5,l,r,h);
	   	res+=ans;
	   }	
	   printf("%lld\n",res);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值