Note that you also need to use a TR [I] to record the node value and Col [I] to record whether the node interval is fully covered.
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 111111;const int maxd = 100001;#define lson pos<<1#define rson pos<<1|1int col[maxn << 2];int tr[maxn << 2];int ret;void pushdown(int pos){ if(col[pos] != -1){ tr[lson] = col[pos]; tr[rson] = col[pos]; col[lson]= col[pos]; col[rson]= col[pos]; col[pos] = -1; } return;}void Query(int L,int R,int l,int r,int pos,int value){ if(col[pos] != -1 && tr[pos] > value) return; //这个减枝非常重要,如果不加就TLE了 if(col[pos] != -1){ //这个区间是一个统一区间 if(L <= l && r <= R){ if(value >= tr[pos]){ ret += (r - l + 1); tr[pos] = value; //区间赋值 col[pos]= value; //懒惰标记 } return; } } pushdown(pos); int m = (l + r) >> 1; if(L <= m) Query(L,R,l,m,lson,value); if(R > m) Query(L,R,m + 1,r,rson,value);}int main(){ int T; scanf("%d",&T); while(T--){ int n = 0,m; ret = 0; scanf("%d",&m); memset(col,0,sizeof(col)); memset(tr,0,sizeof(tr)); for(int i = 0; i < m; i++){ int L,R,v; scanf("%d%d%d",&L,&R,&v); Query(L,R - 1,1,maxd,1,v); } printf("%d\n",ret); } return 0;}
[Ultraviolet A] 1232-Skyline (line segment tree branch reduction)