SBT的幾個題

2021-06-14 13:19:20 字數 4367 閱讀 3519

hdu4006

題目連線:

題意:查詢在某些資料中的第k大數

雖然可以有很多種方法來做,但是作為sbt來練手還是乙個很不錯的題目!這裡面只有sbt的旋轉,維護,插入,選擇這四種基本操作,不涉及到刪除和後繼前驅這些操作,水題

#include#include#include#include#include#includeusing namespace std;

const int maxn=1000005;

int l[maxn],r[maxn],s[maxn],k[maxn];

int node;

int root;

//左旋轉處理

void left_rotate(int &t)

void right_rotate(int &t)

void maintain(int &t,bool flag)

else return;

}else

else return ;

}maintain(l[t],false);

maintain(r[t],true);

maintain(t,false);

maintain(t,true);

}void insert(int &t,int v)//插入新節點

else

}//取得第k大的數

int select(int &t,int kk)

int main()

else}}

return 0;

}

poj3481

題目連線:

題意:對於一些操作  ;當輸入的c==1時表示將優先順序為p的資料編號k加入到佇列中;當 c == 2時表示輸出佇列中權值最大的編號k,並出隊;當 c==3時表示輸出佇列中權值最小的編號k,並出隊。當沒得資料時輸出0

#include#include#include#include#includeusing namespace std;

const int maxn=1000002;

int lson[maxn],rson[maxn],size[maxn],v[maxn],key[maxn];

int node;

int root;

void left_rotate(int &x)

void right_rotate(int &y)

void maintain(int &t,bool flag)

else return;

}else

else return;

}maintain(lson[t],false);

maintain(rson[t],true);

maintain(t,false);

maintain(t,true);

}void insert(int &t,int v,int k)

else

}int rank(int t,int vv)

int maxnum()

if(t!=p)rson[p]=lson[t];

else root=lson[t];

return key[t];

}int minnum()

if(t!=p)lson[p]=rson[t];

else root=rson[t];

return key[t];

}int select(int t,int k)

void left_rotate(int &x)

void right_rotate(int &x)

void maintain(int &t,bool flag)

else return ;

}else

else return ;

}maintain(l[t],false);

maintain(r[t],true);

maintain(t,false);

maintain(t,true);

}void insert(int &t,int v)

else

}int sdelete(int &t,int v)

else

void right_rotate(int &t)

void maintain(int &t,bool flag)

else return;

}else

else return ;

}maintain(l[t],false);

maintain(r[t],true);

maintain(t,false);

maintain(t,true);

}//插入新節點

void insert(int &t,long long v)

else

}//刪除結點,利用的是前驅替換

long long sdelete(int &t,long long v)

else

//查詢樹中是否存在元素

int search(int t,long long kk)

void left_rotate(int &t)

void maintain(int &t,bool flag)

else return;}}

else

else

else return;}}

maintain(t,false);

maintain(t,true);

maintain(lson[t],false);

maintain(rson[t],true);

}void insert(int &t,int v)

else

}int sdelete(int &t,int v)

else if(v>key[t])return sdelete(rson[t],v);

else return sdelete(lson[t],v);

}int select(int t,int k)

while(size[root]>1)

cout<

poj3750

題目連線:

題意:約瑟夫問題--依次輸出出環順序時所對應的的人的名字

#include#include#include#include#include#include#include#include#include#define maxn 100005

using namespace std;

int lson[maxn],rson[maxn];

int size[maxn],key[maxn];

char name[70][20];

int node,root;

void right_rotate(int &t)

void left_rotate(int &t)

void maintain(int &t,bool flag)

else return;}}

else

else

else return;}}

maintain(t,false);

maintain(t,true);

maintain(lson[t],false);

maintain(rson[t],true);

}void insert(int &t,int v)

else

}int sdelete(int &t,int v)

else if(v>key[t])return sdelete(rson[t],v);

else return sdelete(lson[t],v);

}int select(int t,int k)

scanf("%d,%d",&m,&k);

while(size[root])

void left_rotate(int &t)

void maintain(int &t,bool flag)

else return;}}

else

else

else return;}}

maintain(t,false);

maintain(t,true);

maintain(lson[t],false);

maintain(rson[t],true);

}void insert(int &t,int v)

else

}int sdelete(int &t,int v)

else if(v>key[t])return sdelete(rson[t],v);

else return sdelete(lson[t],v);

}int select(int t,int k)

scanf("%d",&k);

m=k;

cout<

幾個概率題

原文 1,一根木棒,截成三截,組成三角形的概率是多少?2,拋乙個六面的色子,連續拋直到拋到6為止,問期望的拋的次數是多少?3,乙個木桶裡面有m個白球,每分鐘從桶中隨機取出乙個球塗成紅色 無論白或紅都塗紅 再放回,問將桶中球全部塗紅的期望時間是多少?4,你有一把寶劍。每使用乙個寶石,有50 的概率會成...

幾個概率題

1,一根木棒,截成三截,組成三角形的概率是多少?2,拋乙個六面的色子,連續拋直到拋到6為止,問期望的拋的次數是多少?3,乙個木桶裡面有m個白球,每分鐘從桶中隨機取出乙個球塗成紅色 無論白或紅都塗紅 再放回,問將桶中球全部塗紅的期望時間是多少?4,你有一把寶劍。每使用乙個寶石,有50 的概率會成功讓寶...

幾個概率題

原文 1,一根木棒,截成三截,組成三角形的概率是多少?2,拋乙個六面的色子,連續拋直到拋到6為止,問期望的拋的次數是多少?3,乙個木桶裡面有m個白球,每分鐘從桶中隨機取出乙個球塗成紅色 無論白或紅都塗紅 再放回,問將桶中球全部塗紅的期望時間是多少?4,你有一把寶劍。每使用乙個寶石,有50 的概率會成...