| ||||||||||
| 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 | |||||||||
崩溃啊。。调试了3个小时的splay竟然TLE。。。。大牛们帮忙看看吧,哪里写搓掉了?# include <iostream>
# include <cstdlib>
# include <cstdio>
using namespace std;
class node
{
public:
node *left;
node *right;
int key;
int num;
int sum;
node():left(NULL),right(NULL),num(0),sum(0){}
};
class tree
{
public:
node *head;
tree():head(NULL){}
void zig(node* &root)
{
node *p1=root->left;
node *p2=root->right;
node *p3=(p1==NULL?NULL:p1->left);
node *p4=(p1==NULL?NULL:p1->right);
node *p5=(p2==NULL?NULL:p2->left);
node *p6=(p2==NULL?NULL:p2->right);
root->left=p1;
root->right=p5;
p2->left=root;
p2->right=p6;
//updata
root->sum=(p1==NULL?0:p1->sum+1)+(p5==NULL?0:p5->sum+1);
root->num=(p1==NULL?0:p1->sum+1);
if(p2!=NULL)
{
p2->sum=root->sum+(p6==NULL?0:p6->sum+1)+1;
p2->num=root->sum+1;
}
//end updata
root=p2;
}
void zag(node* &root)
{
node *p1=root->left;
node *p2=root->right;
node *p3=(p1==NULL?NULL:p1->left);
node *p4=(p1==NULL?NULL:p1->right);
node *p5=(p2==NULL?NULL:p2->left);
node *p6=(p2==NULL?NULL:p2->right);
p1->left=p3;
p1->right=root;
root->left=p4;
root->right=p2;
//updata
root->sum=(p4==NULL?0:p4->sum+1)+(p2==NULL?0:p2->sum+1);
root->num=(p4==NULL?0:p4->sum+1);
if(p1!=NULL)
{
p1->sum=(p3==NULL?0:p3->sum+1)+root->sum+1;
p1->num=(p3==NULL?0:p3->sum+1);
}
//end updata
root=p1;
}
void insert(int key,node* &pos)
{
if(pos==NULL)
{
pos=new node();
pos->key=key;
}
else if(key<pos->key)
{
insert(key,pos->left);
(pos->num)++;
(pos->sum)++;
zag(pos);
}
else
{
insert(key,pos->right);
(pos->sum)++;
zig(pos);
}
}
void del(int key,node* &pos)
{
if(key==pos->key)
{
if(pos->left!=NULL)
{
zag(pos);
del(key,pos->right);
}
else
{
node *temp=pos;
pos=pos->right;
delete temp;
}
}
else if(key<(pos->key))
{
del(key,pos->left);
(pos->num)--;
(pos->sum)--;
}
else
{
del(key,pos->right);
(pos->sum)--;
}
}
node findk(int k,node* &pos)
{
if(k==(pos->num)+1) return *pos;
else if(k<=(pos->num)) return findk(k,pos->left);
else return findk(k-pos->num-1,pos->right);
}
};
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()
{
tree data;
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++)
data.insert(num[j],data.head);
list[1].ans=data.findk(list[1].q,data.head).key;
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++)
data.del(num[j],data.head);
for(int j=list[i].s;j<=list[i].e;j++)
data.insert(num[j],data.head);
}
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++)
data.insert(num[j],data.head);
for(int j=list[i-1].s;j<list[i].s;j++)
data.del(num[j],data.head);
}
else //子集
{
for(int j=list[i-1].s;j<list[i].s;j++)
data.del(num[j],data.head);
for(int j=list[i].e+1;j<=list[i-1].e;j++)
data.del(num[j],data.head);
}
list[i].ans=data.findk(list[i].q,data.head).key;
}
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