线段树——HDU - 1698
题目含义
就是初始化一堆数为1
可以经过操作把一个区间的数都改变
并求这堆数的总大小
题目分析
有一个
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; typedef long long LL; const int maxn=1e5+7; int sum[maxn<<2],lazy[maxn<<2]; int t,len,n,l,r,d; void build(int l,int r,int rt){ lazy[rt]=0; if(l==r){ sum[rt]=1; return; } int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushdown(int l,int r,int rt){ if(lazy[rt]){ int mid=(l+r)>>1; lazy[rt<<1]=lazy[rt]; lazy[rt<<1|1]=lazy[rt]; sum[rt<<1]=(mid+1-l)*lazy[rt]; sum[rt<<1|1]=(r-mid)*lazy[rt]; lazy[rt]=0; } } void updata(int l,int r,int rt,int ll,int rr,int d){ if(ll<=l&&r<=rr){ sum[rt]=(r+1-l)*d; lazy[rt]=d; return; } pushdown(l,r,rt); int mid=(l+r)>>1; if(ll<=mid)updata(l,mid,rt<<1,ll,rr,d); if(rr>mid)updata(mid+1,r,rt<<1|1,ll,rr,d); sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } int main(){ scanf("%d",&t); int ce=1; while(t--){ scanf("%d%d",&len,&n); build(1,len,1); for(int i=1;i<=n;i++){ scanf("%d%d%d",&l,&r,&d); updata(1,len,1,l,r,d); } printf("Case %d: The total value of the hook is %d.\n",ce++,sum[1]); } return 0; }
区间更新,可以用树状数组也可以用线段树
题目代码