bzoj3578 GTY的人類基因組計畫2

2021-07-22 15:38:35 字數 1344 閱讀 6682

description

gty召喚了n個人來做實驗,gty家的房子很大,有m個房間一開始所有人都在1號房間裡,gty會命令某人去某個房間等待做實驗,或者命令一段區間的房間開始實驗,實驗會獲得一些實驗資訊點數,點數為房間裡的人數,如果乙個房間裡的一群人已經做過實驗了那麼這些人將不會增加實驗資訊點數(不會增加是針對這一群人的,不是對這群人中的每個人,即1,2,3做了實驗,1,2再做實驗還會增加2點實驗點數)

input

第一行兩個整數n,m,q(n,m,q<=10^5)表示人數,房間數和運算元

接下來q行每行乙個操作 「c i j」表示讓第i個人去房間j 「w l r」 表示讓區間[l,r]的房間做實驗

output

對於每乙個w操作,輸出乙個數,表示此次操作所獲得的實驗點數

sample input

3 5 7

c 1 2

c 2 2

w 1 2

c 3 2

w 1 2

c 3 3

w 1 3

sample output

題解

可以發現,一次操作最多只能讓做實驗的房間增加2個,也就是說,總共做實驗的次數一定不超過2*q,因此,我們可以用set存可以做實驗的房間,每次詢問實驗點數時二分查詢一下,時間複雜度o(qlogq)。

現在的問題在於怎麼判重。有一種專門針對集合判重的雜湊:對每個人賦乙個long long的初值,將乙個人加入集合就異或這個特徵值,從集合中去掉也異或一遍(異或兩遍等於沒有異或),這樣我們用map搞搞就可以很方便的判重了。

#include 

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

ll hash[100001],size[100001],a[100001];

int loc[100001];

set s;

mapbool> pd;

char read[2];

int main()

size[1]=n;

s.insert(1);

for(int i=1;i<=q;i++)

else

printf("%lld\n",ans);}}

return

0;}

BZOJ3578 GTY的人類基因組計畫2

關於如何判斷乙個集合是否出現過 給每個元素隨機乙個hash權值,然後xor起來即可 插入刪除都只需xor 線段樹維護區間有效人數和,以及打標記表示這個區間的集合要全部標記為出現過,並把區間內sum值都置0 寫hash用了map 了tat include include define n 100010...

bzoj3720 Gty的妹子樹

我們可以樹上分塊,詳見我部落格中雜文下的根號演算法題庫 然後每個塊維護降序,對於整一塊在子樹內的就可以二分,其餘部分暴力。include include include include define fo i,a,b for i a i b i using namespace std const i...

bzoj3744 Gty的妹子序列

time limit 20 sec memory limit 128 mb submit 967 solved 293 submit status discuss 我早已習慣你不在身邊,人間四月天 寂寞斷了弦。回望身後藍天,跟再見說再見 某天,蒟蒻autumn發現了從 gty的妹子樹 bzoj372...