bzoj5155 Tjoi2014 電源插排

2021-08-18 19:52:15 字數 1880 閱讀 5489

description

小m的實驗室有很多電源插排。這些插排的編號從1到n,由左向右排成一排。每天早晨,這些插排都是沒有被使用

的。每當乙個學生來到實驗室,他就將自己的筆記本電源插到某乙個未被使用的插排上。實驗室的同學們都很奇怪

,他們完成這個過程是這樣的:首先,他們找到還沒有被使用的插排的最長區間。如果有多個區間長度相同,他們

就選擇最靠右的那個。然後將自己的電源插到該區間的中間。如果區間長度是偶數,他們同樣選擇靠右的那個。當

乙個同學離開實驗室時,他會將自己的電源拔出來。資料保證每乙個同學來到實驗室時,至少有乙個空的插排。現

在給你實驗室同學的來到和離開事件,和一些詢問。對於每乙個詢問,你需要計算在區間[l,r]已經有多少個插排

被使用了。

input

第一行是兩個整數n和q,表示插排數量和詢問數量。

接下來q行,每一行以乙個整數k開頭,如果k為0,

接下來就是兩個整數l和r(1≤l≤r≤n),表示乙個詢問。否則表示編號為k的學生到來或離開(k≤109)。

k的奇數次出現表示到來,偶數次出現表示離開。每個學生的編號都是唯一的。

n ≤ 10^9, q ≤ 10^5

output

對於每乙個詢問,輸出乙個整數,表示詢問區間內有多少個插排已經被使用了。

sample input

7 10

1 2 3

0 1 2

0 4 7

0 2 5

20 0 6 6

99 0 4 6

sample output

1 2

2 1

3 hint

source

動態開點線段樹 模板題 注意bzoj交的時候我的**裡unordered_map不可用 換成map即可

#include

#include

#include

#include

#include

using

namespace

std;

inline

char gc()

return *s++;

}inline

int read()

while(isdigit(ch)) x=x*10+ch-'0',ch=gc();

return x*f;

}const

int n=1e5+100;

unordered_map

mm,id;int num,n,q,root;

struct node}tree[n*40];

inline

void update(int x,int l,int r)

inline

void init(int &x,int l,int r)

inline

void insert1(int &x,int l,int r,int p,int v)

if (p<=mid) insert1(tree[x].left,l,mid,p,v);

else insert1(tree[x].right,mid+1,r,p,v);update(x,l,r);

}inline

int query(int &x,int l,int r,int len)

inline

int qr(int &x,int l,int r,int l1,int r1)

inline

void print(int x,int l,int r)

int main()++mm[k];if(mm[k]&1)else insert1(root,1,n,id[k],1);

}return

0;}

BZOJ5334 Tjoi2018 數學計算

time limit 10 sec memory limit 256 mb submit 234 solved 155 小豆現在有乙個數x,初始值為1.小豆有q次操作,操作有兩種型別 1 m x x m 輸出 x mod 2 pos x x 第pos次操作所乘的數 保證第pos次操作一定為型別1,對...

Bzoj 3175 Tjoi2013 攻擊裝置

給定乙個01矩陣,其中你可以在0的位置放置攻擊裝置。每乙個攻擊裝置 x,y 都可以按照 日 字攻擊其周圍的 8個位置 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 求在裝置互不攻擊的情況下,最多可以放置多少個裝置。第一...

BZOJ3175 Tjoi2013 攻擊裝置

bzoj3175 tjoi2013 攻擊裝置 給定乙個01矩陣,其中你可以在0的位置放置攻擊裝置。每乙個攻擊裝置 x,y 都可以按照 日 字攻擊其周圍的 8個位置 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 x 1,y 2 x 2,y 1 求在裝置...