HDU-致命武器(線段樹)

月亮踩碎星光 你是一袋藏於銀河的幻想

原網站傳送門
以下爲中文題面

致命武器

時間限制: 1 Sec 內存限制: 128 MB
[命題人:admin] [ Edit] [ TestData]
題目描述
在DOTA遊戲中,屠夫的肉鉤是最可怕的武器,它是由一系列連續的相同長度的金屬棒組成,金屬棒編號爲1到N。初始時金屬棒爲銅。 屠夫可以改變從X到Y的連續金屬棒爲銅、銀或金。

鉤的總價值計算爲N的金屬棍棒的值的總和。更確切地說,每一種棒的價值計算公式如下:

對於每個銅棒,值爲1。

對於每一個銀棒,價值2。

對於每一個金色的棍子,值爲3。

現在計算每次操作後的鉤子的總價值。
輸入
輸入數據包括多組數據,第一行爲組數,組數不超過10組。
每一組數據中,第一行爲數字N(1≤N≤100 000),第二行爲操作數量Q(0≤Q≤100 000)
接下來的Q行,每一行包括三個整數X,Y(1≤X≤Y≤N),Z(1≤Z≤3), 表示將從X到Y區間的金屬棒變爲Z,其中Z=1表示銅,Z=2表示銀,Z=3表示金。
輸出
每一組數據,打印出操作後的鉤子的總價值。
樣例輸入 Copy
1
10
2
1 5 2
5 9 3
樣例輸出 Copy
Case 1: The total value of the hook is 24.

思路: 線段樹的區間修改,練練板子
代碼:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
struct node{
    int l,r,sum;
    int lazy;
}a[maxn*4];
int n,m;
void build(int u,int l,int r){
    a[u].l=l,a[u].r=r,a[u].lazy=1;
    if(l==r) return ;
    int mid=(l+r)>>1;
    build(u<<1,l,mid);build(u<<1|1,mid+1,r);
}
void update(int u,int l,int r,int z){
    if(a[u].lazy==z) return ;
    if(a[u].l==a[u].r){
        a[u].lazy=z;
        return ;
    }
    if(a[u].lazy!=-1){
        a[u<<1].lazy=a[u<<1|1].lazy=a[u].lazy;
        a[u].lazy=-1;
    }
    int mid=(a[u].l+a[u].r)>>1;
    if(r<=mid) update(u<<1,l,r,z);
    else if(l>=mid+1) update(u<<1|1,l,r,z);
    else update(u<<1,l,mid,z),update(u<<1|1,mid+1,r,z);
}
int query(int u,int l,int r){
    if(a[u].l>=l&&a[u].r<=r){
        if(a[u].lazy!=-1) return (a[u].r-a[u].l+1)*a[u].lazy;
        else return query(u<<1,l,r)+query(u<<1|1,l,r);
    }
    if(a[u].lazy!=-1){
        a[u<<1].lazy=a[u<<1|1].lazy=a[u].lazy;
        a[u].lazy=-1;
    }
    int mid=(a[u].l+a[u].r)>>1;
    int res=0;
    if(l<=mid) res+=query(u<<1,l,r);
    if(r>=mid+1) res+=query(u<<1|1,l,r);
    return res;
}
int main(){
    int t;scanf("%d",&t);
    for(int k=1;k<=t;k++){
        scanf("%d%d",&n,&m);
        build(1,1,n);
        while(m--){
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            update(1,x,y,z);
        }
        printf("Case %d: The total value of the hook is %d.\n",k,query(1,1,n));
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章