程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1442 Black Box treap裸題 動態求整個序列的前k大數

POJ 1442 Black Box treap裸題 動態求整個序列的前k大數

編輯:C++入門知識

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define L(id) tree[id].ch[0]
#define R(id) tree[id].ch[1]
#define Size(id) tree[id].size
#define Father(id) tree[id].fa
#define Val(id) tree[id].val
#define ll int
ll Mid(ll x,ll y){return (x+y)>>1;}
#define N 30100

ll a[N], n;
int ch[N][2],val[N],counts[N],r[N],size[N],tot,root;
int Newnode(int &rt,int v)
{
    rt=++tot;
    val[rt]=v;
    ch[rt][0]=ch[rt][1]=0;
    counts[rt]=size[rt]=1;
    r[rt]=rand();
	return rt;
}
inline void PushUp(int rt)
{
    size[rt]=size[ch[rt][0]]+size[ch[rt][1]]+counts[rt];
}
void Rotate(int &x,int kind)
{
    int y=ch[x][kind^1];
    ch[x][kind^1]=ch[y][kind];
    ch[y][kind]=x;
    PushUp(x);PushUp(y);
    x=y;
}
int Insert(int &rt,int v)
{
    if(rt==0)
        return Newnode(rt,v);
	int ans;
    if(v==val[rt]) counts[rt]++, ans = rt;
    else
    {
        int kind=(v>val[rt]);
        ans = Insert(ch[rt][kind],v);
        if(r[ch[rt][kind]]=k) return select(ch[rt][0],k);
    if(size[ch[rt][0]]+counts[rt]>=k) return val[rt];
    return select(ch[rt][1],k-size[ch[rt][0]]-counts[rt]);
}
void remove(int &rt,int v)
{
    if(val[rt]==v)
    {
        if(counts[rt]>1)
            counts[rt]--;
        else if(!ch[rt][0]&&!ch[rt][1])
        {rt=0;return ;}
        else
        {
            int kind=r[ch[rt][0]]val[rt]],v);
    PushUp(rt);
}
void Init()
{
    ch[0][0]=ch[0][1]=0;
    size[0]=counts[0]=val[0]=0;
    tot=root=0;
    r[0]=(1LL<<31)-1;
    Newnode(root,2000000001);
}
int q[N];
int main(){
	int que, i, j, k, l, r;
	while(~scanf("%d %d",&n,&que)){
		Init();
		for(i=1;i<=n;i++)scanf("%d",&a[i]);
		for(i=1;i<=que;i++)scanf("%d",&q[i]);
		int s = 1, cnt = 0;
		for(i=1;i<=n;i++)
		{
			Insert(root, a[i]);
			if(s>n)break;
			while(size[root]-1 == q[s])
			{
				printf("%d\n",select(root,++cnt));
				s++;
			}
		}
	}
	return 0;
}
/*
7 3
1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3

*/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved