1. 程式人生 > >線段樹(lazy)-hdu1689

線段樹(lazy)-hdu1689

題目描述:

現在Pudge想做一些操作。讓我們將鉤子的連續金屬棒從1編號到N。對於每個操作,Pudge可以將連續金屬棒(編號為X到Y)更改為銅棒、銀棒或金棒。鉤的總值是N根金屬棒的總和。更確切地說,每種棍棒的價值計算如下:對於每個銅棒,其值為1。對於每個銀棒,其值為2。對於每個金棒,其值為3。Pudge希望知道在執行操作後鉤子的總值。你可以認為原來的鉤子是用銅棒做的。           

輸入:   

輸入由幾個測試用例組成。輸入的第一行是例項的數目。不超過10例。對於每種情況,第一行包含一個整數N,1<=N<=100000,它是Pudge的鉤子的棒的數量,而第二行包含一個整數Q,0<=Q<=100000,它是操作的數量。接下來的Q行,每行包含三個整數X,Y,1<=X<=Y<=N,Z,1<=Z<=3,它定義了一個操作:將編號從X到Y的棒變為金屬類Z,其中Z=1表示銅類,Z=2表示銀類,Z=3表示金類。

輸出:

對於每種情況,在操作之後用表示鉤子總值的行中打印出鉤子的總價值。使用示例中的格式。

程式碼實現:

 1 #include <cstdio>
 2 
 3 using namespace std;
 4 const int MAXN = 1e6;
 5 int N;
 6 typedef long long ll;
 7 /*
 8 LL其實代表long long, * 1LL是為了在計算時,把int型別的變數轉化為long long,
 9 然後再賦值給long long型別的變數
10 */
11 struct node{
12     int l,r;
13     ll sum,lazy;
14 void update(ll x){ 15 sum=1ll*(r-l+1)*x;///1LL是為了在計算時,把int型別的變數轉化為long long,然後再賦值給long long型別的變數。 16 lazy=x; 17 } 18 }tree[MAXN<<2]; 19 20 void push_up(int x){ 21 tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum; 22 } 23 24 void push_down(int x){ 25 ll lazyval=tree[x].lazy;
26 if(lazyval>0){ 27 tree[x<<1].update(lazyval); 28 tree[x<<1|1].update(lazyval); 29 tree[x].lazy=0; 30 } 31 } 32 33 void build(int x,int l,int r){ 34 tree[x].lazy=tree[x].sum=0; 35 tree[x].l=l;tree[x].r=r; 36 if(l==r){ 37 tree[x].sum=1; 38 return; 39 } 40 int mid=(l+r)/2; 41 build(x<<1,l,mid); 42 build(x<<1|1,mid+1,r); 43 push_up(x); 44 } 45 46 void update(int x,int l,int r,ll val){ 47 int L=tree[x].l,R=tree[x].r; 48 //printf("½Úµã%d ×ó£º%d ÓÒ£º%d\n",x,L,R); 49 if(l<=L && R<=r){ 50 // printf("lazy\n"); 51 tree[x].update(val); 52 return ; 53 } 54 push_down(x); 55 int mid=(L+R)/2; 56 if(mid>=l) 57 update(x<<1,l,r,val); 58 if(mid<r) 59 update(x<<1|1,l,r,val); 60 push_up(x); 61 } 62 63 ll query(int x,int l,int r){ 64 int L=tree[x].l,R=tree[x].r; 65 if(l<=L && R<=r) 66 return tree[x].sum; 67 push_down(x); 68 int mid=(L+R)/2; 69 ll ans=0; 70 if(mid>=l) 71 ans+=query(x<<1,l,r); 72 if(mid<r) 73 ans+=query(x<<1|1,l,r); 74 return ans; 75 } 76 77 int main(){ 78 int T;scanf("%d",&T); 79 int cae=0; 80 while(T--){ 81 scanf("%d",&N); 82 build(1,1,N); 83 int M;scanf("%d",&M); 84 while(M--){ 85 int l,r; 86 ll val; 87 // printf("N=%d,M=%d,T=%d\n",N,M,T); 88 scanf("%d%d%lld",&l,&r,&val); 89 update(1,l,r,val); 90 } 91 printf("Case %d: The total value of the hook is %lld.\n",++cae,query(1,1,N)); 92 } 93 return 0; 94 }