flag[i]:标记i这个区间的值。
val[i]:i这个区间的长度
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; #define INF 99999999 #define lmin 1 #define rmax n #define lson l,(l+r)/2,rt<<1 #define rson (l+r)/2+1,r,rt<<1|1 #define root lmin,rmax,1 #define maxn 110000 int flag[maxn*4]; int val[maxn*4]; void push_up(int rt) { if(flag[rt<<1]==flag[rt<<1|1]) flag[rt]=flag[rt<<1]; } void push_down(int rt) { if(flag[rt]) { flag[rt<<1]=flag[rt<<1|1]=flag[rt]; flag[rt]=0; } } void creat(int l,int r,int rt) { flag[rt]=1; val[rt]=r-l+1; if(l!=r) { creat(lson); creat(rson); } } void update(int ll,int rr,int x,int l,int r,int rt) { if(rr<l||ll>r)return; if(ll<=l&&rr>=r) { flag[rt]=x; return; } push_down(rt); update(ll,rr,x,lson); update(ll,rr,x,rson); push_up(rt); } int query(int ll,int rr,int l,int r,int rt) { if(rr<l||ll>r)return 0; if(ll<=l&&rr>=r&&flag[rt]) { return flag[rt]*val[rt]; } return query(ll,rr,lson)+query(ll,rr,rson); } int main() { int T,cas,n,l,r,x,q; scanf("%d",&T); cas=0; while(T--) { cas++; scanf("%d",&n); creat(root); scanf("%d",&q); while(q--) { scanf("%d%d%d",&l,&r,&x); update(l,r,x,root); } printf("Case %d: The total value of the hook is %d.\n",cas,query(1,n,root)); } return 0; }
hdu-1698-Just a Hook-线段树-区域更新,区域查询
时间: 2024-11-05 11:42:57