bzoj4923 splay K小值查詢

2021-08-18 22:32:35 字數 2359 閱讀 1121

4923: [lydsy1706月賽]k小值查詢

time limit: 15 sec memory limit: 256 mb

submit: 415 solved: 121

[submit][status][discuss]

description

維護乙個長度為n的正整數序列a_1,a_2,…,a_n,支援以下兩種操作:

1 k,將序列a從小到大排序,輸出a_k的值。

2 k,將所有嚴格大於k的數a_i減去k。

input

第一行包含兩個正整數n,m(1<=n,m<=100000),分別表示序列的長度和操作的個數。

第二行包含n個正整數a_1,a_2,…,a_n(1<=a_i<=10^9),分別表示序列中的每個元素。

接下來m行,每行兩個正整數op(1<=op<=2),k,若op=1,則1<=k<=n;若op=2,則1<=k<=10^9;依次描述每個操作。

output

輸出若干行,對於每個詢問輸出一行乙個整數,即第k小的值。

sample input

4 51 5 6 12

2 51 1

1 21 3

1 4

sample output

hint

source

本oj付費獲取

考慮用splay來維護數的排名。感官上有些數修改之後的相對排名時不會變的。

考慮1到k的數不會被修改。k+1到2k的數修改之後會和前面的數排名交叉,2k+1到inf的數修改後相對排名不變。後面的數打個標記即可。中間的數至少會減少一半,暴力修改插入即可。

像我這樣不**記憶體的,記得把記憶體開大點。我調了2h。。

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef long long ll;

typedef double db;

int n,m;

inline int

read()

const int n=5e6+7;

int val[n],lc[n],rc[n],fa[n],siz[n],cnt[n];

int tag[n];

inline void add(int

x,inty)}

inline void tag_down(intx)}

inline void updata(int

x)inline void rotate(int

x) if(rc[y]==x) rc[y]=b,lc[x]=y;

else

lc[y]=b,rc[x]=y;

updata(y);

}int sta[n],rt;

inline void splay(int

x,int f)

rotate(x);

} updata(x);

if(!f) rt=x;

}inline int kth(int

x,inty)}

int tot;

inline int insert(int

x,int

y) }

++tot;

if(val[now2]else

lc[now2]=tot;

val[tot]=x;

fa[tot]=now2;

cnt[tot]=y;

splay(tot,0);

return tot;

}int a[n];

inline void build(int &k,int l,int r)

int b;

intq[n],qr;

inline void sc(int

x)inline void del(int

x) splay(x,0);

if(!lc[x])

if(!rc[x])

rt=rc[x];

fa[rc[x]]=0;

inty=rc[x];

tag_down(y);

while(lc[y])

lc[y]=lc[x];

fa[lc[x]]=y;

splay(lc[x],0);

}inline void debug(int

x)int main()

build(rt,1,n);

tot=n;

int a;

for(int j=1;j<=m;++j)

}}

bzoj1430 小猴打架

description 一開始森林裡面有n只互不相識的小猴子,它們經常打架,但打架的雙方都必須不是好朋友。每次打完架後,打架的雙方以及它們的好朋友就會互相認識,成為好朋友。經過n 1次打架之後,整個森林的小猴都會成為好朋友。現在的問題是,總共有多少種不同的打架過程。比如當n 3時,就有六種不同的打架...

BZOJ1430 小猴打架

標籤 prufer序列 題目傳送門 description 一開始森林裡面有n只互不相識的小猴子,它們經常打架,但打架的雙方都必須不是好朋友。每次打完架後,打架的雙方以及它們的好朋友就會互相認識,成為好朋友。經過n 1次打架之後,整個森林的小猴都會成為好朋友。現在的問題是,總共有多少種不同的打架過程...

BZOJ4711 小奇挖礦

題目背景 小奇在喵星系使用了無限非概率驅動的採礦機,以至於在所有星球上都採出了一些礦石,現在它準備建一些礦石倉 庫並把礦石運到各個倉庫裡。問題描述 喵星系有n個星球,標號為1到n,星球以及星球間的航線形成一棵樹。所有星球間的雙向航線的長度都為1。小奇要 在若干個星球建礦石倉庫,設立每個倉庫的費用為k...