水题,但是被一个区间有多个高度不同的楼的判断卡了好久,之前脑子不够清晰,没想清楚,其实很简单。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100000+5;
int l,r,v;
struct Interval{
int setv[maxn*4],minv[maxn*4];
void clear() {memset(minv,0,sizeof(minv));memset(setv,0,sizeof(setv));}
void pushdown(int o){
if(setv[o]>=0){
setv[o*2]=setv[o*2+1]=setv[o];
minv[o*2]=minv[o*2+1]=setv[o];
setv[o]=-2;//如果当前已经有楼并且又访问到了,那么说明这个区间的楼会有高度不想等,那么设为-2,不能访问,强制向下访问
}
}
int updata(int o,int L,int R)
{
if(minv[o]>v) return 0;
if(l<=L&&R<=r){
if(v>=setv[o]&&setv[o]!=-2){
setv[o]=minv[o]=v;
return R-L+1;
}
}
pushdown(o);
int mid=(L+R)/2;
int ans=0;
if(l<=mid) ans+=updata(o*2,L,mid);
if(r>mid) ans+=updata(o*2+1,mid+1,R);
minv[o]=min(minv[o*2],minv[o*2+1]);
return ans;
}
};
Interval tree;
const int N=100000;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
tree.clear();
int ans=0;
for(int i=0;i<n;i++) {scanf("%d%d%d",&l,&r,&v);r--;ans+=tree.updata(1,1,N);}
cout<<ans<<endl;
}
return 0;
}