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 "weedbits/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 }
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張,他們等了很久也沒有等來失主,於是決定把錢平分。但錢可能無法平分。他們先把能夠平分的錢盡量先平分了,使得剩下不能平分的錢盡量少。這些不能平分的錢怎麼辦呢他?他們決定拿去賭場裡面賭一把。他們運氣太好了,那些不能平分的錢變成了雙倍,於是他們就把那個錢分了...