[POJ 1442]Black Box
生活随笔
收集整理的這篇文章主要介紹了
[POJ 1442]Black Box
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
囧囧有個囧盒,可以處理一些很囧的事情。這個囧盒一開始是空的,可以處理2種操作:
Add(X):將元素X放入囧盒。
Get:第I次調用Get的時候,輸出囧盒里面第I小的數。下面是囧囧操作的一個例子:
| 1 | ADD(3) | 0 | 3 | - |
| 2 | GET | 1 | 3 | 3 |
| 3 | ADD(1) | 1 | 1,3 | - |
| 4 | GET | 2 | 1,3 | 3 |
| 5 | ADD(-4) | 2 | -4,1,3 | - |
| 6 | ADD(2) | 2 | -4,1,2,3 | - |
| 7 | ADD(8) | 2 | -4,1,2,3,8 | - |
| 8 | ADD(-1000) | 2 | -1000,-4,1,2,3,8 | - |
| 9 | GET | 3 | -1000,-4,1,2,3,8 | 1 |
| 10 | GET | 4 | -1000,-4,1,2,3,8 | 2 |
| 11 | ADD(2) | 4 | -1000,-4,1,2,2,3,8 | - |
LT看到囧囧這個囧盒很羨慕,他想搞個類似的家伙來,于是找到了你。
Input
第一行兩個數N,M(1<=N,M<=30000),分別表示ADD操作的個數和Get操作的個數。
第二行N個MaxLongint范圍內的整數,表示ADD操作順序插入的元素值。
第三行M個數(按非降序排列),表示M條Get命令的位置(位于第幾條ADD命令之后)
Output
M行,分別對應M條GET操作的輸出。(任意時刻Get次數不會超過當前Add次數)
Sample Input
7 4
3 1 -4 2 8 -1000 2
1 2 6 6
Sample Output
3
3
1
2
splay板子題,直接找第k大即可。兩個堆的寫法更快
#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define inf 0x7f7f7f7f using namespace std; typedef long long ll; typedef unsigned int ui; typedef unsigned long long ull; inline int read(){int x=0,f=1;char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';return x*f; } inline void print(int x){if (x>=10) print(x/10);putchar(x%10+'0'); } const int N=3e4; struct Splay{#define T(x) (tree[f[x]][1]==x)int tree[N+10][2],f[N+10],size[N+10],val[N+10];int root,len;void updata(int x){size[x]=size[tree[x][0]]+size[tree[x][1]]+1;}void move(int x){int fa=f[x],son=tree[x][T(x)^1];tree[x][T(x)^1]=fa;tree[fa][T(x)]=son;if (son) f[son]=fa;f[x]=f[fa];if (f[x]) tree[f[x]][T(fa)]=x;f[fa]=x;updata(fa),updata(x);}void splay(int x){while (f[x]){if (f[f[x]]) T(x)==T(f[x])?move(f[x]):move(x);move(x);}root=x;}void insert(int x){val[++len]=x;if (!root){size[root=len]=1;return;}int i=root;while (1){size[i]++;if (x<=val[i]){if (!tree[i][0]){f[tree[i][0]=len]=i;break;}i=tree[i][0];}else{if (!tree[i][1]){f[tree[i][1]=len]=i;break;}i=tree[i][1];}}splay(len);}int Get_pre(){int x=tree[root][0];while (tree[x][1]) x=tree[x][1];return x;}int find(int x,int i){if (size[tree[i][0]]+1==x) return i;if (x<=size[tree[i][0]]) return find(x,tree[i][0]);return find(x-size[tree[i][0]]-1,tree[i][1]);} }T; int A[N+10],Get[N+10]; int main(){int n=read(),m=read();for (int i=1;i<=n;i++) A[i]=read();for (int i=1;i<=m;i++) Get[read()]++;for (int i=1,k=0;i<=n;i++){T.insert(A[i]);while (Get[i]--) printf("%d\n",T.val[T.find(++k,T.root)]);}return 0; }轉載于:https://www.cnblogs.com/Wolfycz/p/9478960.html
總結
以上是生活随笔為你收集整理的[POJ 1442]Black Box的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AWS 使用总结
- 下一篇: 第三章JavaScript 内置对象