權值線段樹 Jzoj P4270 魔道研究

2022-09-18 01:00:13 字數 2271 閱讀 4404

description

「我希望能使用更多的魔法。不對,是預定能使用啦。最終我要被大家稱呼為大魔法使。為此我決定不惜一切努力。」

——《the grimoire of marisa》霧雨魔理沙

魔理沙一如既往地去帕秋莉的大圖書館去借魔導書(grimoire) 來學習魔道。

最開始的時候,魔理沙只是一本一本地進行研究。然而在符卡戰中,魔理沙還是戰不過帕秋莉。

好在魔理沙對自己的借還和研究結果進行了記錄,從而發現了那些魔導書的精妙之處。

帕秋莉的那些魔導書,每本都有乙個類別編號ti 和威力大小pi。而想要獲得最有威力的魔法,就必須同時研究一些魔導書。而研究的這些魔導書就必須要滿足,類別編號為t 的書的本數小於等於t,並且總共的本數小於等於乙個給定的數n。而研究這些魔導書之後習得的魔法的威力就是被研究的魔導書的威力之和。

為了擊敗帕秋莉,魔理沙想要利用自己發現的規律來獲得最有威力的魔法。

她列出了計畫中之後m 次的借還事件,並想要知道每個事件之後自己所能獲得的魔法的最大威力。可她忙於魔法材料——蘑菇的收集,於是這個問題就交給你來解決了。

input

輸入檔案grimoire.in。

第1 行2 個整數n,m,分別表示魔理沙能研究的魔導書本數的上限和她的借還事件數。

之後m 行,每行的形式為「op t p」(不含引號)。op 為「borrow」 或「return」,分別表示借書和還書。t 為乙個整數,表示這本書的類別編號。p為乙個整數,表示這本書的威力大小。注意,還書時如果有多本書滿足類別編號為t,威力大小為p,這表明這些書都是相同的,魔理沙會任選其中一本書還回去。如果你問我為何會有相同的書,多半因為這是魔導書吧。

output

輸出檔案grimoire.out。

一共m 行,每行乙個整數,即每個事件之後的最大威力。

sample input

5 10 

borrow 1 5811 

borrow 3 5032

return 3 5032 

borrow 3 5550 

borrow 5 3486 

return 1 5811 

return 3 5550 

borrow 4 5116 

borrow 3 9563 

borrow 5 94

sample output

5811

10843

5811

11361

14847

9036

3486

8602

18165

18259

data constraint

對於5% 的資料,1 <= t,n,m <= 50。

對於10% 的資料,1 <= t,n,m <= 100。

對於30% 的資料,1 <= t,n,m<= 10 000。

另有30% 的資料,1 <= p <= 1 000。

對於100% 的資料,1 <= t,n,m <= 300 000,1<= p<= 1 000 000 000。

另外,總共有30% 的資料,滿足沒有「return」 操作。這部分資料均勻分布。

1 #include2 #include3

using

namespace

std;

4const

int n=300010*2,inf=1000000000;5

inttot,root[n],num[n],left[n],right[n];

6long

long ans,sum[300010];7

char

ch;8

void add(int &x,int l,int r,int k,intf)9

16int query(int x,int l,int r,int

k)17

23int mid=(l+r)/2;24

if (num[right[x]]>=k) return query(right[x],mid+1

,r,k);

25else

2630}31

intmain()

3250}51

else

5261

}62 ans=0

;63 query(root[0],0

,inf,n);

64 printf("

%lld\n

",ans);65}

66return0;

67 }

權值線段樹

維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...

權值線段樹

include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...

權值線段樹

權值線段樹是線段樹的一種,但是它與線段樹不同 線段樹的每個結點是用來維護一段區間的最大值或總和 而權值線段樹的每個結點儲存的一段區間有多少個數 權值線段樹主要用來查詢區間第k大或者第k小的值 現在有乙個陣列x 10 對陣列排序後為x 10 每個數的個數如下 1 32 2 3 24 1 5 18 1 ...