BZOJ 1861 书架

(╯-_-)╯╧╧

此处为错误代码。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 300050
#define inf 2147483646
using namespace std;
int n,m,a[maxn],x,y;
int tree[maxn][3],size[maxn],fath[maxn],val[maxn],root,hash[maxn],rr=0;
char s[10];
void pushup(int now)
{
    size[now]=size[tree[now][1]]+size[tree[now][2]]+1;
}
void reset(int x)
{
    fath[x]=tree[x][1]=tree[x][2]=0;
    size[x]=1;
}
void sets(int x,int y)
{
    swap(fath[x],fath[y]);
    if (fath[x]==y)
    {
        fath[x]=fath[y];fath[y]=x;

    }
}
void build(int &now,int left,int right,int father)
{
    if (left>right) return;
    int mid=(left+right)>>1;now=mid;
    fath[now]=father;val[now]=a[mid];
    build(tree[now][1],left,mid-1,now);
    build(tree[now][2],mid+1,right,now);
    pushup(now);
}
void rotate(int x,int &k)
{
    int y=fath[x],z=fath[y],l,r;
    if (tree[y][1]==x) l=1;else l=2;
    r=3-l;
    if (y==k) k=x;
    else
    {
        if (tree[z][1]==y) tree[z][1]=x;
        else tree[z][2]=x;
    }
    fath[x]=z;fath[y]=x;fath[tree[x][r]]=y;
    tree[y][l]=tree[x][r];tree[x][r]=y;
    pushup(y);pushup(x);
}
void splay(int x,int &k)
{
    while (x!=k)
    {
        int y=fath[x],z=fath[y];
        if (y!=k)
        {
            if ((tree[y][1]==x)^(tree[z][1]==y)) rotate(x,k);
            else rotate(y,k);
        }
        rotate(x,k);
    }
}
int get_pre(int x)
{
    int ret=tree[x][1];
    while (tree[ret][2])
        ret=tree[ret][2];
    return ret;
}
int get_sub(int x)
{
    int ret=tree[x][2];
    while (tree[ret][1])
        ret=tree[ret][1];
    return ret;
}
void delete_(int x)
{
    splay(x,root);
    int pre=get_pre(root);
    int ls=tree[x][1],rs=tree[x][2];
    root=ls;fath[ls]=fath[rs]=0;splay(pre,root);
    tree[root][2]=rs;fath[rs]=root;pushup(root);
    reset(x);
}
int find_kth(int now,int x)
{
    int r=size[tree[now][1]];
    if (x<=r) return find_kth(tree[now][1],x);
    else if (x>r+1) return find_kth(tree[now][2],x-r-1);
    else
    {
        rr=now;
        return now;
    }
}
int get_rank(int x)
{
    splay(x,root);
    return size[tree[root][1]];
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i+1]);
        hash[a[i+1]]=i+1;
    }
    a[1]=n+1;a[n+2]=n+2;
    build(root,1,n+2,0);
    for (int i=1;i<=m;i++)
    {
        scanf("%s",s);
        if (s[0]==‘T‘)
        {
            scanf("%d",&x);
            delete_(hash[x]);
            y=find_kth(root,1);
            splay(y,root);
            int rs=tree[root][2];
            reset(root);
            fath[root]=hash[x];fath[rs]=hash[x];tree[hash[x]][1]=root;tree[hash[x]][2]=rs;pushup(hash[x]);
            root=hash[x];
            splay((n+3)>>1,root);
        }
        else if (s[0]==‘B‘)
        {
            scanf("%d",&x);
            delete_(hash[x]);
            y=find_kth(root,n+1);
            splay(y,root);
            int ls=tree[root][1];
            reset(root);
            fath[root]=hash[x];fath[ls]=hash[x];tree[hash[x]][2]=root;tree[hash[x]][1]=ls;pushup(hash[x]);
            root=hash[x];
            splay((n+3)>>1,root);
        }
        else if (s[0]==‘I‘)
        {
            scanf("%d%d",&x,&y);
            if (y==0) continue;
            else if (y==-1)
            {
                int pre=get_pre(hash[x]);
                sets(pre,hash[x]);
            }
            else
            {
                int sub=get_sub(hash[x]);
                sets(hash[x],sub);
            }
            splay(hash[x],root);
        }
        else if (s[0]==‘A‘)
        {
            scanf("%d",&x);
            printf("%d\n",get_rank(hash[x])-1);
            splay(hash[x],root);
    }
        else
        {
            rr=0;
            scanf("%d",&x);
            printf("%d\n",val[find_kth(root,x+1)]);
            splay(rr,root);
        }
    }
    return 0;
}
时间: 2025-01-11 01:33:14

BZOJ 1861 书架的相关文章

[题解]bzoj 1861 Book 书架 - Splay

1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1396  Solved: 803[Submit][Status][Discuss] Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位

BZOJ 1861: [Zjoi2006]Book 书架 (splay)

1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1453  Solved: 822[Submit][Status][Discuss] Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位

BZOJ 1861: [Zjoi2006]Book 书架 splay

1861: [Zjoi2006]Book 书架 Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置.不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1.X或X+1本

BZOJ 1861 ZJOI 2006 Book 书架 Splay

题目大意:有一个书架,现在需要经常改变这些书的位置,每次询问一本书在哪或者第几本书是什么. 思路:赤裸裸的Splay,只是有些小事需要注意.因为他有的时候问你一个书在哪,这个事情不能只在Splay中就能解决,我们需要辅助他解决.注意到操作中没有加入书的操作,也就是书的总数并不会变化,而且Splay的过程中只是指针的变动,所以不会有点发生变化,所以在一开始建树的时候维护一个数组,表示这本书在Splay中的节点,这样我们就能快速的找到任意一本书的节点.询问一本书的排名的时候,我们需要先找到这个节点,

BZOJ 1861 [Zjoi2006]Book 书架 ——Splay

[题目分析] 模板题目. 首尾两个虚拟结点,十分方便操作. [代码] #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <map> #include <set> #include <queue> #include <string> #include <iostream> #include

【BZOJ 1861】Book 书架

Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位置.不过小T的记忆力是非常好的,所以每次放书的时候至少能够将那本书放在拿出来时的位置附近,比如说她拿的时候这本书上面有X本书,那么放回去时这本书上面就只可能有X-1.X或X+1本书. 当然也有特殊情况,比如在看书的时候突然电话

bzoj 1861

就是将区间上的点移位,用2次rev的话代码量降下来了(orzLSJ build忘记return...然而本地测试居然没事?卡了好久挺不值啊

【刷题】BZOJ 1926 [Sdoi2010]粟粟的书架

Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位置都摆有一本书,上数第i 行.左数第j 列摆放的书有Pi,j页厚.粟粟每天除了读书之外,还有一件必不可少的工作就是摘苹果,她每天必须摘取一个指定的苹果.粟粟家果树上的苹果有的高.有的低,但无论如何凭粟粟自己的个头都难以摘到.不过她发现, 如果在脚下放上几本书,就可以够着苹果:她同时注意到

AC日记——[Sdoi2010]粟粟的书架 bzoj 1926

1926 思路: 主席树+二分水题: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500005 #define maxr 205 #define maxn_ maxn*13 #define FalseAns "Poor QLW" int n,m,q,lc[maxn_],rc[maxn_],num[maxn_],ci[maxn_],tot,root[maxn]; int ai[maxn],bi[