poj3481

Posted 宣毅鸣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj3481相关的知识,希望对你有一定的参考价值。

题解:

splay操作

读入速度太慢,导致超时。。。

用字符串gets操作

代码:

#pragma GCC optimize(2)
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1100005;
char s[100];
int pre[N],tot,q[10],y,data[N],z,size[N];
int aans[N],p,c[N][2],root,n,m,x;
void rot(int x)
{
    int y=pre[x],k=(c[y][0]==x);
    size[y]=size[c[y][k]]+size[c[x][k]]+1;
    size[x]=size[c[x][!k]]+size[y]+1;
    c[y][!k]=c[x][k];
    pre[c[y][!k]]=y;
    pre[x]=pre[y];
    if(pre[y])c[pre[y]][c[pre[y]][1]==y]=x;
    c[x][k]=y;pre[y]=x;
}
void splay(int x,int g)
{
    for(int y=pre[x];y!=g;rot(x),y=pre[x])
     if(pre[y]!=g)rot((x==c[y][0])==(y==c[pre[y]][0])?y:x);
    if(g==0)root=x;
}
void insert(int x,int q)
{
    int y=root;
    while(c[y][x>data[y]]) y=c[y][x>data[y]];
    data[++tot]=x;aans[tot]=q;
    c[tot][0]=c[tot][1]=0;
    pre[tot]=y;
    if(y)c[y][x>data[y]]=tot;
    splay(tot,0);
}
int findmin()  
{  
    int y=root;
    while (c[y][0])y=c[y][0];  
    if (y==root)root=c[y][1],pre[c[y][1]]=0;  
    else c[pre[y]][0]=c[y][1],pre[c[y][1]]=pre[y];  
    return aans[y];  
}  
int findmax()  
{  
    int y=root;
    while (c[y][1])y=c[y][1];  
    if (y==root)root=c[y][0],pre[c[y][0]]=0;  
    else c[pre[y]][1]=c[y][0],pre[c[y][0]]=pre[y];  
    return aans[y];  
}  
int main()
{
    while (1)
     {
         gets(s);
         if (s[0]==0)return 0;
         if (s[0]==1)
         {
             int z=0,y=0;
             int i;
             for (i=2;s[i]>=0&&s[i]<=9;i++)z=z*10+s[i]-48;
             i++;
             for (;s[i]>=0&&s[i]<=9;i++)y=y*10+s[i]-48;
            insert(y,z);
         }
         if (s[0]==3)printf("%d\n",findmin());
         if (s[0]==2)printf("%d\n",findmax());
     }
}

 

以上是关于poj3481的主要内容,如果未能解决你的问题,请参考以下文章

poj 3481 平衡树

POJ 3481 Double Queue (treap模板)

POJ 3481 Double Queue(set实现)

POJ3481(待完善版本,请看注释)

POJ3481 Double Queue

POJ 3481 Double Queue(Treap模板题)