HDU 1698 Just a Hook 区间更新 lazy标记
Posted blues
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1698 Just a Hook 区间更新 lazy标记相关的知识,希望对你有一定的参考价值。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <sstream> 5 #include <string> 6 #include <algorithm> 7 #include <list> 8 #include <map> 9 #include <vector> 10 #include <queue> 11 #include <stack> 12 #include <cmath> 13 #include <cstdlib> 14 #include <conio.h> 15 using namespace std; 16 #define clc(a,b) memset(a,b,sizeof(a)) 17 #define inf 0x3f3f3f3f 18 const int N=100010; 19 const int MOD = 1e9+7; 20 #define LL long long 21 double const pi = acos(-1); 22 void fre() { 23 freopen("in.txt","r",stdin); 24 } 25 // inline int r() { 26 // int x=0,f=1;char ch=getchar(); 27 // while(ch>\'9\'||ch<\'0\') {if(ch==\'-\') f=-1;ch=getchar();} 28 // while(ch>=\'0\'&&ch<=\'9\') { x=x*10+ch-\'0\';ch=getchar();}return x*f; 29 // } 30 int n; 31 struct node{ 32 int l,r,sum; 33 int lazy; 34 }tree[N<<2]; 35 36 void pushdown(int rt){ 37 if(tree[rt].lazy!=0){ 38 tree[rt<<1].lazy=tree[rt<<1|1].lazy=tree[rt].lazy; 39 tree[rt<<1].sum=(tree[rt<<1].r-tree[rt<<1].l+1)*tree[rt<<1].lazy; 40 tree[rt<<1|1].sum=(tree[rt<<1|1].r-tree[rt<<1|1].l+1)*tree[rt<<1|1].lazy; 41 tree[rt].lazy=0; 42 } 43 } 44 45 void updata(int l,int r,int x,int L,int R,int rt){ 46 if(tree[rt].lazy==x) return; 47 if(l<=L&&r>=R){ 48 tree[rt].lazy=x; 49 tree[rt].sum=x*(R-L+1); 50 return; 51 } 52 pushdown(rt); 53 int mid=(L+R)>>1; 54 if(r<=mid) 55 updata(l,r,x,L,mid,rt<<1); 56 else if(l>mid) 57 updata(l,r,x,mid+1,R,rt<<1|1); 58 else{ 59 updata(l,r,x,L,mid,rt<<1); 60 updata(l,r,x,mid+1,R,rt<<1|1); 61 } 62 tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum; 63 return; 64 } 65 66 void build(int l,int r,int rt){ 67 tree[rt].l=l; 68 tree[rt].r=r; 69 tree[rt].lazy=1; 70 if(l==r){ 71 tree[rt].sum=1; 72 return; 73 } 74 int mid=(l+r)>>1; 75 build(l,mid,rt<<1); 76 build(mid+1,r,rt<<1|1); 77 tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum; 78 return; 79 } 80 81 int main(){ 82 // fre(); 83 int T,q,l,r,x; 84 scanf("%d",&T); 85 int cas=1; 86 while(T--){ 87 scanf("%d",&n); 88 build(1,n,1); 89 // for(int i=1;i<=18;i++) 90 // { 91 // printf("%d\\n",tree[i].sum); 92 // } 93 // getch(); 94 scanf("%d",&q); 95 while(q--){ 96 scanf("%d%d%d",&l,&r,&x); 97 updata(l,r,x,1,n,1); 98 // for(int i=1;i<=25;i++){ 99 // printf("%d:%d\\n",i,tree[i].sum); 100 // } 101 // system("pause"); 102 } 103 printf("Case %d: The total value of the hook is %d.\\n",cas++,tree[1].sum); 104 } 105 return 0; 106 }
以上是关于HDU 1698 Just a Hook 区间更新 lazy标记的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1698 Just a Hook (区间更新+延迟标记)
杭电 HDU ACM 1698 Just a Hook(线段树 区间更新 延迟标记)
HDU 1698 Just a Hook (线段树区间更新入门题)