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...