zoukankan      html  css  js  c++  java
  • 并不对劲的bzoj1861: [Zjoi2006]Book 书架

    传送门->

    这题的正确做法是splay维护这摞书。

    但是并不对劲的人选择了暴力(皮这一下很开心)。

    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iomanip>
    #include<iostream>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    #define rep(i,x,y) for(register int i=(x);i<=(y);++i)
    #define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
    #define re register
    #define maxn 300010
    using namespace std;
    inline int read()
    {
        int x=0,f=1;
        char ch=getchar();
        while(isdigit(ch)==0 && ch!='-')ch=getchar();
        if(ch=='-')f=-1,ch=getchar();
        while(isdigit(ch))x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
        return x*f;
    }
    inline void write(int x)
    {
        int f=0;char ch[20];
        if(!x){puts("0");return;}
        if(x<0){putchar('-');x=-x;}
        while(x)ch[++f]=x%10+'0',x/=10;
        while(f)putchar(ch[f--]);
        putchar('
    ');
    }
    int a[maxn],tr[maxn],pos[maxn],n,m,qx,qy,hd,tl;
    char s[20];
    int lt(int x){return x&(-x);}
    void add(int x,int k){for(;x<=n+m*2;x+=lt(x))tr[x]+=k;}
    int ask(int x){int k=0;for(;x;x-=lt(x))k+=tr[x];return k;}
    int kth(int k)
    {
        int l=hd,r=tl,ans=tl+233;
        while(l<=r)
        {
            int mi=(r+l)>>1;
            int rank=ask(mi);
            if(rank==k)ans=min(ans,mi);
            if(rank>=k)r=mi-1;
            else l=mi+1;
        }
        return ans;
    }
    int main()
    {
        n=read(),m=read();hd=1+m,tl=n+m;
        rep(i,1,n)a[i+m]=read(),pos[a[i+m]]=i+m,add(i+m,1);
        rep(k,1,m)
        {
        	scanf("%s",s);qx=read();
        	if(s[0]=='T')add(pos[qx],-1),hd--,add(hd,1),swap(a[hd],a[pos[qx]]),pos[qx]=hd;
        	if(s[0]=='B')add(pos[qx],-1),tl++,add(tl,1),swap(a[tl],a[pos[qx]]),pos[qx]=tl;
        	if(s[0]=='I')
        	{
        		qy=read();if(!qy)continue;
        		int tmp=ask(pos[qx])+qy;
        	//	cout<<"rank:"<<tmp<<endl;
        		int ans=kth(tmp);
        	//	cout<<"ans&pos:"<<qx<<" "<<a[ans]<<pos[qx]<<" "; 
                int px=pos[qx];
                swap(pos[qx],pos[a[ans]]);swap(a[px],a[ans]);// cout<<pos[qx]<<endl;
        	}
        	if(s[0]=='A')write(ask(pos[qx])-1);
        	if(s[0]=='Q')
        	{
        		int ans=kth(qx);
        		write(a[ans]);
        	}
       	//cout<<"a:"<<endl;
       	//rep(i,1,n+m*2)cout<<a[i]<<" ";cout<<endl;
       	//cout<<"pos:"<<endl;
       	//rep(i,1,n)cout<<pos[i]<<" ";cout<<endl;
        }
        return 0;
    }
    /*
    10 10
    1 3 2 7 5 8 10 4 9 6
    Query 3
    Top 5
    Ask 6
    Bottom 3
    Ask 3
    Top 6
    Insert 4 -1
    Query 5
    Query 2
    Ask 2
    */
    

      

    据说照顾了splay的大肠腧的数据为暴力提供了漏洞。

  • 相关阅读:
    python之 网络编程、异常处理、面向对象
    python sys模块、mongodb操作、接口开发、程序分目录、压缩解压文件
    linux安装redis完整步骤
    python之:map、filter、random、datatime,写日志,发邮件,操作mysql、redis,MD5加密,写excel
    函数、模块
    python json处理、集合操作、函数定义、文件读写
    python字典、list、字符串常见处理方法、元组、文件读写
    学习笔记
    接口测试笔记
    【04】Cent OS 7 中部署JDK + Tomcat 环境
  • 原文地址:https://www.cnblogs.com/xzyf/p/8798067.html
Copyright © 2011-2022 走看看