hihoCoder 1078 線段樹的區間修改

來源:互聯網
上載者:User

標籤:acm   資料結構   演算法   

還是最基礎的線段樹噢  這次是區間修改

#include<cstdio>#include<cstring>#include<algorithm>#define lc p<<1,s,mid#define rc p<<1|1,mid+1,e#define mid (s+e)/2using namespace std;const int N = 100005;int sum[4 * N], setv[4 * N];void pushup(int p){    sum[p] = (sum[p << 1] + sum[p << 1 | 1]);}void pushdown(int p, int s, int e){    if(setv[p] == 0) return;    sum[p << 1] = (mid - s + 1) * setv[p];    sum[p << 1 | 1] = (e - mid) * setv[p];    setv[p << 1] = setv[p];    setv[p << 1 | 1] = setv[p];    setv[p] = 0;}void build(int p, int s, int e){    setv[p] = 0;    if(s == e) scanf("%d", &sum[p]);    else    {        build(lc);        build(rc);        pushup(p);    }}void update(int p, int s, int e, int l, int r, int v){    if(s >= l && e <= r)    {        setv[p] = v;        sum[p] = (e - s + 1) * v;        return;    }    pushdown(p, s, e);    if(r <= mid) update(lc, l, r, v);    else if(l > mid) update(rc, l, r, v);    else update(lc, l, mid, v), update(rc, mid + 1, r, v);    pushup(p);}int query(int p, int s, int e, int l, int r){    if(s >= l && e <= r) return sum[p];    pushdown(p, s, e);    if(r <= mid) return query(lc, l, r);    if(l > mid) return query(rc, l, r);    return query(lc, l, mid) + query(rc, mid + 1, r);}int main(){    int n, m, a, b, c, op;    while(~scanf("%d", &n))    {        build(1, 1, n);        scanf("%d", &m);        while(m--)        {            scanf("%d", &op);            if(op)            {                scanf("%d%d%d", &a, &b, &c);                update(1, 1, n, a, b, c);            }            else            {                scanf("%d%d", &a, &b);                printf("%d\n", query(1, 1, n, a, b));            }        }    }    return 0;}

#1078 : 線段樹的區間修改時間限制:10000ms單點時限:1000ms記憶體限制:256MB
描述

對於小Ho表現出的對線段樹的理解,小Hi表示挺滿意的,但是滿意就夠了嗎?於是小Hi將問題改了改,又出給了小Ho:

假設貨架上從左至右擺放了N種商品,並且依次標號為1到N,其中標號為i的商品的價格為Pi。小Hi的每次操作分為兩種可能,第一種是修改價格——小Hi給出一段區間[L, R]和一個新的價格NewP,所有標號在這段區間中的商品的價格都變成NewP。第二種操作是詢問——小Hi給出一段區間[L, R],而小Ho要做的便是計算出所有標號在這段區間中的商品的總價格,然後告訴小Hi。

那麼這樣的一個問題,小Ho該如何解決呢?

提示:推動科學發展的除了人的好奇心之外還有人的懶惰心!

輸入

每個測試點(輸入檔案)有且僅有一組測試資料。

每組測試資料的第1行為一個整數N,意義如前文所述。

每組測試資料的第2行為N個整數,分別描述每種商品的重量,其中第i個整數表示標號為i的商品的重量Pi。

每組測試資料的第3行為一個整數Q,表示小Hi進行的運算元。

每組測試資料的第N+4~N+Q+3行,每行分別描述一次操作,每行的開頭均為一個屬於0或1的數字,分別表示該行描述一個詢問和一次商品的價格的更改兩種情況。對於第N+i+3行,如果該行描述一個詢問,則接下來為兩個整數Li, Ri,表示小Hi詢問的一個區間[Li, Ri];如果該行描述一次商品的價格的更改,則接下來為三個整數Li,Ri,NewP,表示標號在區間[Li, Ri]的商品的價格全部修改為NewP。

對於100%的資料,滿足N<=10^5,Q<=10^5, 1<=Li<=Ri<=N,1<=Pi<=N, 0<Pi, NewP<=10^4。

輸出

對於每組測試資料,對於每個小Hi的詢問,按照在輸入中出現的順序,各輸出一行,表示查詢的結果:標號在區間[Li, Ri]中的所有商品的價格之和。

範例輸入
104733 6570 8363 7391 4511 1433 2281 187 5166 378 61 5 10 15771 1 7 36490 8 100 1 41 6 8 1571 3 4 1557
範例輸出
473114596


hihoCoder 1078 線段樹的區間修改

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.