HDU1698 Just a Hook
初始的时候,整个序列都是1,接下来,每次输入l,r,x。表示将l到r之间修改为x且x只会是1、2、3,最后问你序列总和。
线段树成段更新~
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e6+14; struct node { int l; int r; int lazy; int tag; int sum; }segTree[maxn*4]; void build (int i,int l,int r) { segTree[i].l=l; segTree[i].r=r; segTree[i].lazy=0; segTree[i].tag=0; if (l==r) { segTree[i].sum=1; return; } int mid=(l+r)>>1; build(i<<1,l,mid); build(i<<1|1,mid+1,r); segTree[i].sum=segTree[i<<1].sum+segTree[i<<1|1].sum; } void update (int i,int l,int r,int v) { if (segTree[i].l==l&&segTree[i].r==r) { segTree[i].lazy=1; segTree[i].tag=v; segTree[i].sum=(r-l+1)*v; return; } int mid=(segTree[i].l+segTree[i].r)>>1; if (segTree[i].lazy==1) { segTree[i].lazy=0; update(i<<1,segTree[i].l,mid,segTree[i].tag); update(i<<1|1,mid+1,segTree[i].r,segTree[i].tag); segTree[i].tag=0; } if (r<=mid) update(i<<1,l,r,v); else if (l>mid) update(i<<1|1,l,r,v); else { update(i<<1,l,mid,v); update(i<<1|1,mid+1,r,v); } segTree[i].sum=segTree[i<<1].sum+segTree[i<<1|1].sum; } int main () { int x,y,z,n,m,T; scanf ("%d",&T); for (int i=1;i<=T;i++) { scanf ("%d %d",&n,&m); build (1,1,n); while (m--) { scanf ("%d %d %d",&x,&y,&z); update(1,x,y,z); } printf ("Case %d: The total value of the hook is %d.\n",i,segTree[1].sum); } return 0; }