P1801 黑匣子 NOI導刊2010提高(06)

2022-05-05 20:03:10 字數 1584 閱讀 7198

題目描述

black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的.而i等於0。這個black box要處理一串命令。

命令只有兩種:

add(x):把x元素放進blackbox;

get:i加1,然後輸出blackhox中第i小的數。

記住:第i小的數,就是black box裡的數的按從小到大的順序排序後的第i個元素。例如:

我們來演示一下乙個有11個命令的命令串。(如下圖所示)

現在要求找出對於給定的命令串的最好的處理方法。add和get命令分別最多200000個。現在用兩個整數陣列來表示命令串:

1.a(1),a(2),…a(m):一串將要被放進black box的元素。每個數都是絕對值不超過2000000000的整數,m$200000。例如上面的例子就是a=(3,1,一4,2,8,-1000,2)。

2.u(1),u(2),…u(n):表示第u(j)個元素被放進了black box裡後就出現乙個get命令。例如上面的例子中u=(l,2,6,6)。輸入資料不用判錯。

輸入輸出格式

輸入格式:

第一行,兩個整數,m,n。

第二行,m個整數,表示a(l)

……a(m)。

第三行,n個整數,表示u(l)

…u(n)。

輸出格式:

輸出black box根據命令串所得出的輸出串,乙個數字一行。

裸的平衡樹treap,當複習了

靠最大值爆我取的inf了調了半天qaq

treap還是要熟練掌握得(認真臉)

#include#include#include#include#include#includetypedef long long ll;

using namespace std;

ll rd()

while(c >= '0' && c <= '9')

return flag * out;

}const ll maxn = 200019,inf = 0xfffffffffffffff;

ll ch[maxn][2];

ll val[maxn],dat[maxn];

ll size[maxn],cnt[maxn];

ll tot,root;

ll new(ll v)

void pushup(ll id)

void build()

void rotate(ll &id,ll d)

void insert(ll &id,ll v)

if(val[id] == v)

ll d = v < val[id] ? 0 : 1;

insert(ch[id][d],v);

if(dat[id] < dat[ch[id][d]])rotate(id,d ^ 1);

pushup(id);

}ll get_val(ll id,ll rank)

ll num,na;

ll ori[maxn],ask[maxn],p = 1;

int main()

return 0;

}

P1801 黑匣子 NOI導刊2010提高(06)

black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,然後輸出blackhox中第i小的數。記住 第i小的數,...

P1801 黑匣子 NOI導刊2010提高(06)

black box是一種原始的資料庫。它可以儲存乙個整數陣列,還有乙個特別的變數i。最開始的時候black box是空的 而i等於0。這個black box要處理一串命令。命令只有兩種 add x 把x元素放進blackbox get i加1,然後輸出blackhox中第i小的數。記住 第i小的數,...

洛谷P1801 黑匣子

題目傳送門 分析 這題和另外乙個題目中位數非常相似,有興趣可以先看看,比這一題簡單。首先暴力模擬還是別想了,估計30 的資料都有點懸。正解應該是用二叉堆。但是如果用乙個堆當然不方便,所以建兩個堆,乙個大根堆,乙個小根堆,每次只要出現詢問操作,就把小根堆的堆頂丟進大根堆中維護,然後輸出就可以了,但是要...