| ||||||||||
| 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 | |||||||||
再给一个这个问题的伸展树版本吧,好像很搓。。。。5S多过的。。还是SBT强啊。。In Reply To:感谢陈启峰大牛的Size Balanced Tree,贴AC代码,顺便放出模板~~~大家共享吧 Posted by:yzhw at 2009-09-26 13:36:25 Source Code
Problem: 2761 User: yzhw
Memory: 3952K Time: 5954MS
Language: G++ Result: Accepted
Source Code
# include <iostream>
using namespace std;
# include <cstdio>
# include <cstring>
# include <cstdlib>
template <typename key_type>
class SplayTree
{
public:
SplayTree()
{
nil = new node;
nil->size = 0;
nil->lchild = nil;
nil->rchild = nil;
root = nil;
}
~SplayTree()
{
clear();
delete nil;
}
void clear()
{
while (root != nil)
erase(maximum());
}
void erase(const key_type &x);
const key_type &maximum()
{
node *p = root;
while (p->rchild != nil)
p = p->rchild;
splay(root, p->key);
return p->key;
}
const key_type &minimum()
{
node *p = root;
while (p->lchild != nil)
p = p->lchild;
splay(root, p->key);
return p->key;
}
void insert(const key_type &x);
const key_type &select(int rank);
private:
struct node
{
key_type key;
int size;
node *lchild, *rchild;
node() {}
node(const key_type &x) : key(x) {}
}*nil, *root;
void splay(node *&root, const key_type &x);
void splay2(node *&root);
};
template <typename key_type>
void SplayTree<key_type>::erase(const key_type &key)
{
if (root == nil) throw "not found";
splay(root, key);
if (root->key != key) throw "not found";
node *new_root;
int size = root->size;
if (root->lchild == nil)
new_root = root->rchild;
else
{
new_root = root->lchild;
splay2(new_root); //If key < key+1, it is equivalent to "splay(new_root, key+1)".
new_root->rchild = root->rchild;
}
new_root->size = root->size-1;
delete root;
root = new_root;
}
template <typename key_type>
void SplayTree<key_type>::insert(const key_type &key)
{
node *new_root = new node(key);
if (root == nil)
{
new_root->size = 1;
new_root->lchild = nil;
new_root->rchild = nil;
root = new_root;
return;
}
splay(root, key);
new_root->size = root->size+1;
if (key < root->key)
{
new_root->lchild = root->lchild;
root->lchild = nil;
new_root->rchild = root;
root->size = root->rchild->size+1;
}
else
{
new_root->rchild = root->rchild;
root->rchild = nil;
new_root->lchild = root;
root->size = root->lchild->size+1;
}
root = new_root;
}
template <typename key_type>
const key_type &SplayTree<key_type>::select(int rank)
{
node *p = root;
for(;;)
{
int pos=(p->lchild?p->lchild->size:0);
if (rank <=pos)
p = p->lchild;
else if (rank>pos+1)
rank -= pos+1, p = p->rchild;
else break;
}
splay(root, p->key);
return p->key;
}
template <typename key_type>
void SplayTree<key_type>::splay(node *&root, const key_type &key)
{
int lsize = 0, rsize = 0;
node head, *ltree = &head, *rtree = &head;
head.lchild = nil;
head.rchild = nil;
for(;;)
{
if (key < root->key)
{
if (root->lchild != nil && key < root->lchild->key)
{
node *p = root->lchild;
root->lchild = p->rchild;
p->rchild = root;
root->size = root->lchild->size+root->rchild->size+1;
root = p;
}
if (root->lchild == nil)
break;
rtree->lchild = root;
rtree = root;
root = root->lchild;
rsize += rtree->rchild->size+1;
}
else if (root->key < key)
{
if (root->rchild != nil && root->rchild->key < key)
{
node *p = root->rchild;
root->rchild = p->lchild;
p->lchild = root;
root->size = root->lchild->size+root->rchild->size+1;
root = p;
}
if (root->rchild == nil)
break;
ltree->rchild = root;
ltree = root;
root = root->rchild;
lsize += ltree->lchild->size+1;
}
else break;
}
lsize += root->lchild->size;
rsize += root->rchild->size;
root->size = lsize+rsize+1;
ltree->rchild = nil;
rtree->lchild = nil;
for (node *p = head.rchild; p != nil; p = p->rchild)
{
p->size = lsize;
lsize -= p->lchild->size+1;
}
for (node *p = head.lchild; p != nil; p = p->lchild)
{
p->size = rsize;
rsize -= p->rchild->size+1;
}
ltree->rchild = root->lchild;
root->lchild = head.rchild;
rtree->lchild = root->rchild;
root->rchild = head.lchild;
}
template <typename key_type>
void SplayTree<key_type>::splay2(node *&root)
{
int lsize = 0;
node head, *ltree = &head;
head.lchild = nil;
head.rchild = nil;
for(;;)
{
if (root->rchild != nil)
{
node *p = root->rchild;
root->rchild = p->lchild;
p->lchild = root;
root->size = root->lchild->size+root->rchild->size+1;
root = p;
}
if (root->rchild == nil)
break;
ltree->rchild = root;
ltree = root;
root = root->rchild;
lsize += ltree->lchild->size+1;
}
lsize += root->lchild->size;
root->size = lsize+1;
ltree->rchild = nil;
for (node *p = head.rchild; p != nil; p = p->rchild)
{
p->size = lsize;
lsize -= p->lchild->size+1;
}
ltree->rchild = root->lchild;
root->lchild = head.rchild;
}
//start
struct ques
{
int s,e;
int id;
int q;
int ans;
}list[50001];
int cmp(const void *a,const void *b)
{
ques *aa=(ques *)a;
ques *bb=(ques *)b;
if(aa->s!=bb->s) return aa->s-bb->s;
else return aa->e-bb->e;
}
int cmp1(const void *a,const void *b)
{
ques *aa=(ques *)a;
ques *bb=(ques *)b;
return aa->id-bb->id;
}
int main()
{
SplayTree<int> refer;
int num[100001];
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",num+i);
}
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&list[i].s,&list[i].e,&list[i].q);
list[i].id=i;
}
qsort(list+1,m,sizeof(ques),cmp);
for(int j=list[1].s;j<=list[1].e;j++)
refer.insert(num[j]);
list[1].ans=refer.select(list[1].q);
for(int i=2;i<=m;i++)
{
if(list[i].s>=list[i-1].e)//区间错开
{
for(int j=list[i-1].s;j<=list[i-1].e;j++)
refer.erase(num[j]);
for(int j=list[i].s;j<=list[i].e;j++)
refer.insert(num[j]);
}
else if(list[i].s<=list[i-1].e&&list[i].e>list[i-1].e)//区间部分包含
{
for(int j=list[i-1].e+1;j<=list[i].e;j++)
refer.insert(num[j]);
for(int j=list[i-1].s;j<list[i].s;j++)
refer.erase(num[j]);
}
else //子集
{
for(int j=list[i-1].s;j<list[i].s;j++)
refer.erase(num[j]);
for(int j=list[i].e+1;j<=list[i-1].e;j++)
refer.erase(num[j]);
}
list[i].ans=refer.select(list[i].q);
}
qsort(list+1,m,sizeof(ques),cmp1);
for(int i=1;i<=m;i++)
printf("%d\n",list[i].ans);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator