HDU 1698 線段樹
阿新 • • 發佈:2018-12-04
要求:區間改數裸題。
方法:線段樹模板。
1.套用線段樹模板即可,注意add陣列不用加,而是賦值。
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; int k,n,q,a,b,c; int sum[1000005],add[1000005]; void build(int o,int l,int r) { int i,j,k; int m=(l+r)/2; sum[o]=r-l+1; if(l>=r) return; build(o*2,l,m); build(o*2+1,m+1,r); } void init() { int i,j,k; scanf("%d%d",&n,&q); memset(sum,0,sizeof(sum)); memset(add,0,sizeof(add)); build(1,1,n); } void pushdown(int i,int ln,int rn) { if(add[i]>0) { sum[i*2]=add[i]*ln; sum[i*2+1]=add[i]*rn; add[i*2]=add[i]; add[i*2+1]=add[i]; add[i]=0; } } void pushup(int i) { sum[i]=sum[i*2]+sum[i*2+1]; } void update(int i,int L,int R) { int lc=i*2,rc=i*2+1; int M=L+(R-L)/2; if(a<=L&&R<=b)//addv 存的是區間+add { add[i]=c; sum[i]=c*(R-L+1); return; } pushdown(i,M-L+1,R-M);//下去add if(a<=M) update(lc,L,M); if(b>M) update(rc,M+1,R); pushup(i);//上去add } int main() { int i,j,k,t; scanf("%d",&t); for(i=1;i<=t;i++) { init(); for(j=1;j<=q;j++) { scanf("%d%d%d",&a,&b,&c); update(1,1,n); } printf("Case %d: The total value of the hook is %d.\n",i,sum[1]); } }