HDU 1698 線段樹成段更新
題意:線段樹成段更新,最後查詢全區間。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 100005 int node[maxn<<2],col[maxn<<2]; void build(int rt,int l,int r) { col[rt]=0,node[rt]=1; if(l==r) return; int mid=(l+r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); node[rt]=node[rt<<1]+node[rt<<1|1]; } void update(int L,int R,int c,int l,int r,int rt) { if(L<=l&&r<=R) { col[rt]=c; node[rt]=(r-l+1)*c; return; } if(col[rt]) { int m=(r-l+1); col[rt<<1]=col[rt<<1|1]=col[rt]; node[rt<<1]=(m-(m>>1))*col[rt]; node[rt<<1|1]=(m>>1)*col[rt]; col[rt]=0; } int mid=(l+r)>>1; if(L<=mid) update(L,R,c,l,mid,rt<<1); if(mid<R) update(L,R,c,mid+1,r,rt<<1|1); node[rt]=node[rt<<1]+node[rt<<1|1]; } int main() { int n,q,t,a,b,c,cas=0; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&q); build(1,1,n); while(q--) { scanf("%d%d%d",&a,&b,&c); update(a,b,c,1,n,1); } printf("Case %d: The total value of the hook is %d.\n",++cas,node[1]); } return 0; }
最後更新:2017-04-03 18:52:03