20161003 NOIP 模擬賽 T2 解題報告

2022-06-02 16:21:07 字數 2098 閱讀 7686

weed

duyege的電腦上面已經長草了,經過辨認上面有金坷垃的痕跡。

為了查出真相,duyege 準備修好電腦之後再進行一次金坷垃的模擬實驗。

電腦上面有若干層金坷垃,每次只能在上面撒上一層高度為 vi 的金坷垃,或者除掉最 新 vi 層(不是量)撒的金坷垃。如果上面只留有不足 vi 層金坷垃,那麼就相當於電腦上 面沒有金坷垃了。

duyege 非常嚴謹,一開始先給你 m 個上述操作要你依次完成。然後又對實驗步驟進行 了 q 次更改,每次更改都會改變其中乙個操作為另外乙個操作。每次修改之後都會詢問最 終金坷垃的量有多少。

輸入第一行為兩個正整數 m、q,接下來 m 行每行 2 個整數 k、vi。k 為 0 時撒金坷垃, 為 1 時除金坷垃。接下來 q 行每行 3 個整數 ci、k、vi,ci 代表被更改的操作是第 ci 個, 後面 2 個數描述更改為這樣的操作。 輸出 q 行代表每次金坷垃的量為多少

對於 30%的資料,m<=1000,q<=1000.

對於另外 20%的資料,每次 k=1 時都會將金坷垃清空。

對於 100%的資料,m<=2*10^5,q<=2*10^5,vi<=10^4.

——————————————分割線——————————————

分析:

( 30分 )這道題樸素想法是每次對某個操作修改,然後依次算到最後乙個元素。

( 100分 )樸素的想法在逐個計算上耗時太多,這時我們需要一種資料結構,能夠對某個操作修改,又能夠對某一段查詢,那麼不難想到線段樹。

我們需要維護三個資訊,即當前區間中操作的金坷垃數量,層數,以及需要刪去更左邊操作的層數。

顯然左邊的刪除操作不會影響之後的操作,那麼我們只需要對每個節點進行結算,統計即可。

下面**的push_up函式比較難懂,特此注釋。

1 #include "

bits/stdc++.h"2

#define never return

3#define explode 0 45

using

namespace

std ;

6struct segtree ;

7const

int maxn = 2e5 + 100;8

9 segtree tr[ maxn << 2

] ;10

intarr[ maxn ] ;

11bool

op[ maxn ] ;

1213

intinput ( )

16while ( ch >= '

0' && ch <= '

9' )

17return x *f ;18}

1920

int query_tree ( const

int i , const

inttarget )

24else

if ( target < tr[ i << 1 | 1

].add )

27else30}

3132

void push_up ( const

inti )

40else

if ( !tr[ rchild ].del )

45else 50}

51void build_tree ( const

int x , const

int y , const

inti ) 60}

61else

67return;68

}6970void update_tree ( const

int i , const

inttarget )

76else80}

81else

87return;88

}8990int

main ( )

102fclose(stdin);

103fclose(stdout);

104never explode ;

105 }

weed

noip_rp++;

2016-10-07 20:28:07

(完)

noip模擬賽 密碼

表示沒看懂演算法3 問題描述 有壓迫,就有反抗。mored的寵物在法庭的幫助下終於反抗了。作為乙隻聰明的寵物,他打算把魔法使mored的魔法書盜去,奪取mored的魔法能力。但mored怎麼會讓自己的魔法書輕易地被盜取?mored在魔法書上設定了乙個密碼鎖,密碼鎖上有乙個問題。施以斯臥鋪魔法吧,你有...

NOIP模擬賽 老師

題目描述 一座有n層的教學樓裡有一些學生,第i 0 i n 層有studentsi個學生。你被給定了乙個數k,如果第i層有x個學生,那麼這一層需要 x k 個老師。你可以調整每個學生的樓層,但是每個學生至多只能調整一層,就是說第i層的學生只能去第i 1層 如果有的話 第i層 第i 1層 如果i 1 ...

NOIP模擬賽 分錢

題目描述 兩個人在街上撿到了一些錢,這些錢共有n張,他們等了很久也沒有等來失主,於是決定把錢平分。但錢可能無法平分。他們先把能夠平分的錢盡量先平分了,使得剩下不能平分的錢盡量少。這些不能平分的錢怎麼辦呢他?他們決定拿去賭場裡面賭一把。他們運氣太好了,那些不能平分的錢變成了雙倍,於是他們就把那個錢分了...