第一次AC的数据结构的题目呢,线段树简单题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # include <cstdio> 2 # include <iostream> 3 # include <algorithm> 4 # include <cstring> 5 using namespace std; 6 7 const int maxn=1e5+5; 8 int val[maxn*4],lazy[maxn*4]; 9 10 void build(int l,int r,int rt){ 11 if(l==r){ 12 val[rt]=1; 13 return ; 14 } 15 int mid=(l+r)>>1; 16 build(l,mid,rt<<1); 17 build(mid+1,r,rt<<1|1); 18 val[rt]=val[rt<<1]+val[rt<<1|1]; 19 } 20 21 void pushdown(int rt,int l,int r,int mid){ 22 lazy[rt<<1]=lazy[rt]; 23 val[rt<<1]=(mid-l+1)*lazy[rt]; 24 lazy[rt<<1|1]=lazy[rt]; 25 val[rt<<1|1]=(r-mid)*lazy[rt]; 26 lazy[rt]=0; 27 } 28 29 void update(int l,int r,int L,int R,int rt,int c){ 30 if(L<=l&&r<=R) { 31 lazy[rt]=c; 32 val[rt]=(r-l+1)*c; 33 return ; 34 } 35 int mid=(l+r)>>1; 36 if(lazy[rt]) pushdown(rt,l,r,mid); 37 if(L<=mid) 38 update(l,mid,L,R,rt<<1,c); 39 if(mid<R) 40 update(mid+1,r,L,R,rt<<1|1,c); 41 val[rt]=val[rt<<1]+val[rt<<1|1]; 42 } 43 44 void sum(int l,int r,int rt){ 45 if(l==r) return ; 46 int mid=(l+r)>>1; 47 if(lazy[rt]) pushdown(rt,l,r,mid); 48 sum(l,mid,rt<<1); 49 sum(mid+1,r,rt<<1|1); 50 val[rt]=val[rt<<1]+val[rt<<1|1]; 51 } 52 53 int main(){ 54 int t,l=0; 55 scanf("%d",&t); 56 while(l<t){ 57 int n,q; 58 scanf("%d",&n); 59 build(1,n,1); 60 scanf("%d",&q); 61 for(int i=0;i<q;i++){ 62 int a,b,c; 63 scanf("%d%d%d",&a,&b,&c); 64 update(1,n,a,b,1,c); 65 } 66 sum(1,n,1); 67 printf("Case %d: The total value of the hook is %d. ",++l,val[1]); 68 } 69 return 0; 70 }
似乎最后的sum()不需要的,然而影响也不大
区间更新,lazy标记,简单题
最后抛个链接,欢迎入坑,http://www.bilibili.com/video/av9919498