| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
其实平衡树也行的,就是实现起来比较麻烦,很容易错In Reply To:这提除了用堆做,还有没有跟好的算法啊? Posted by:frankhuhu at 2007-02-16 17:35:42 > rt
> 还有,在pku上面为啥cin这么慢啊?scanf用155ms,cin就tle,差得太多了吧
你如果喜欢,用平衡树做也行。下面是一个平衡树的实现:)
#include<iostream>
// 1442 in pku
using namespace std;
enum {
SIZ = 30008,
};
struct Node {
int u; // used ?
int v; // value of this node
int l,r;
int cnt; // number that <= this node
};
int input[SIZ];
int tmp[SIZ];
int N,M, pos;
Node tree[SIZ];
int next;
int build_tree(int s, int e){
if(e <= s)
return -1;
int m = (s + e) / 2;
int ret = next ++;
Node *tptr = &tree[ret];
tptr->v = tmp[m];
tptr->u = tptr->cnt = 0;
tptr->l = build_tree(s, m);
tptr->r = build_tree(m+1,e);
return ret;
}
int insert_tree(int r, int v){
if(r < 0)
return -1;
if(tree[r].v == v){ // special for equals, first left, second right, last itself
int t = insert_tree(tree[r].l, v);
if(t == -1){
t = insert_tree(tree[r].r, v);
} else {
tree[r].cnt ++;
}
if(t != -1)
return 0;
if(tree[r].u == 1){
return -1;
}
tree[r].u = 1;
return 0;
}
if(tree[r].v > v){
int t = insert_tree(tree[r].l, v);
if(t != -1){
tree[r].cnt ++;
}
return t;
}
return insert_tree(tree[r].r, v);
}
int find_tree(int r, int p){
if(tree[r].cnt > p){
return find_tree(tree[r].l, p);
}
p -= tree[r].cnt;
if(p ==0 && tree[r].u){
return tree[r].v;
}
p -= tree[r].u;
return find_tree(tree[r].r, p);
}
int readIn(){
int i;
if(scanf("%d%d",&N,&M) <= 0)
return 0;
for(i=0;i<N;i++){
scanf("%d", &input[i]);
tmp[i] = input[i];
}
sort(tmp, tmp+N);
next = 0;
build_tree(0, N);
return 1;
}
void fun(){
int cur, i=0, t;
pos = 0;
while(M --){
scanf("%d", &cur);
while(i < cur){
insert_tree(0, input[i]);
i ++;
}
t = find_tree(0, pos);
printf("%d\n", t);
pos ++;
}
}
int main(){
int tstcase = 0;
while( readIn() ){
if(tstcase ++){
printf("\n");
}
fun();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator