当前位置: 首页 > news >正文

ZJOI2006 书架

一道平衡树裸题,但要注意细节。pos数组定位该元素的权重。

#include<bits/stdc++.h>
#define N 80009
using namespace std;
#define sight(c) ('0'<=c&&c<='9')
#define RR NULL
#define dwl  writel 
inline void read(int &x){
    static char c;static int b;
    for (b=1,c=getchar();!sight(c);c=getchar())if (c=='-') b=-1;
    for (x=0;sight(c);c=getchar())x=x*10+c-48;x*=b;
}
void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('\n'); }
inline void writel(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar(' '); }
struct Node{
    int val,key;
    Node() {}
    Node(int V,int K):val(V),key(K){}
    inline bool operator <(const Node& A)const{ return val<A.val;}
};
inline int rod() {
    static int x=23333;
    return x^=x<<13,x^=x>>17,x^=x<<5;
}
struct Treap{
    Node key;int val,siz;Treap* son[2];
    Treap() { val=rod(); siz=1; son[0]=son[1]=RR;}
    Treap(int V,int K) {
        key.key=K; key.val=V; val=rod(); siz=1; son[0]=son[1]=RR;
    }
    inline void rob(){
        siz=1;
        if (son[0]) siz+=son[0]->siz;
        if (son[1]) siz+=son[1]->siz;
    }
    inline int ask(){
        return son[0]?son[0]->siz+1:1;
    }
};
int find(int x,Treap *now){
    if (!now) return 0;
    if (now->key.val<x) return now->ask()+find(x,now->son[1]);
    return find(x,now->son[0]);
}
void spilt(Treap *now,int k,Treap *&x,Treap *&y){
    if (!now) {x=y=RR;return;}
    int cmp=now->ask();
    if (k>=cmp) x=now,spilt(x->son[1],k-cmp,x->son[1],y); 
    else  y=now,spilt(y->son[0],k,x,y->son[0]);
    now->rob();
}
Treap* merge(Treap *x,Treap *y){
    if (!x) return y; if (!y) return x;
    if (x->val<y->val) {x->son[1]=merge(x->son[1],y);x->rob();return x;}
    y->son[0]=merge(x,y->son[0]); y->rob(); return y;
}
void dfs(Treap* x){
    if (!x) return;
    if (x->son[0]) dfs(x->son[0]);
    dwl(x->key.key);
    if (x->son[1]) dfs(x->son[1]);
    x->rob();
}
int n,m,pos[N],a[N],x,l,r,k,op;
char ch[1707];
#define Mid (l+r>>1)
void build (Treap* &now,int l,int r){
    if (l>r) return;
    now=new Treap(Mid,a[Mid]);
    build(now->son[0],l,Mid-1); build(now->son[1],Mid+1,r);
    now->rob();
}
Treap *root,*xr,*yr,*zr,*tr;
int main () {
//   freopen("a.in","r",stdin);
//   freopen("a.out","w",stdout);
   read(n); read(m);
//   for (int i=1;i<=n;i++)
//    read(a[i]),pos[a[i]]=i;
//   build(root,1,n);
   for(int i=1;i<=n;i++) {
        read(x); pos[x]=i; 
     root=merge(root,new Treap(i,x));
   } 
//   dfs(root); putchar('\n');
   l=1; r=n;
   while (m--) {
        scanf("%s",ch);
        switch (ch[0]) {
             case 'T':
                 read(x); k=find(pos[x],root);
                 spilt(root,k,xr,yr); spilt(yr,1,tr,yr);
                 pos[x]=--l; root=merge(new Treap(pos[x],x),merge(xr,yr));
                 break;
             case 'B':
                 read(x); k=find(pos[x],root);
                 spilt(root,k,xr,yr); spilt(yr,1,tr,yr);
                 pos[x]=++r; root=merge(merge(xr,yr),new Treap(pos[x],x));
                break;
             case 'I':
                 read(x); read(op);
                 if (op==1) {
                     k=find(pos[x],root);
                     spilt(root,k,xr,yr); spilt(yr,2,tr,yr); spilt(tr,1,tr,zr);
                     swap(pos[tr->key.key],pos[zr->key.key]);
                     swap(tr->key.val,zr->key.val);
                     root=merge(merge(xr,zr),merge(tr,yr));    
                 }
            if (op==-1) {
                k=find(pos[x],root);
                     spilt(root,k-1,xr,yr); spilt(yr,2,tr,yr); spilt(tr,1,tr,zr);
                     swap(pos[tr->key.key],pos[zr->key.key]);
                     swap(tr->key.val,zr->key.val);
                root=merge(merge(xr,zr),merge(tr,yr));
            }
                  break;
             case 'A':
                 read(x); writeln(find(pos[x],root));
                 break;
             case 'Q':
                 read(k); spilt(root,k-1,xr,yr); spilt(yr,1,yr,zr);
                 writeln(yr->key.key);
                 root=merge(merge(xr,yr),zr);
                 break;
       } 
   } return 0;
}

 

转载于:https://www.cnblogs.com/gaozeke/p/8335991.html

相关文章:

  • sdfasdf
  • 设计模式六大原则
  • 10.15 iptables filter表案例 10.16/10.17/10.18 iptable
  • 前端工程化(Gulp、Webpack)-webpack
  • Squirrel GUI+ Phoenix 连接Hbase
  • 集群介绍,keepalived介绍,用keepalived配置高可用集群
  • 011-Spring Boot 运行流程分析SpringApplication.run
  • Linux Centos 7 - 系统安装
  • 宝哥iOS网络篇-AFNetworking基础使用指南
  • JS数组方法汇总
  • [解决方案]sql server复制需要有实际的服务器名称才能连接到服务器
  • 远程管理防火墙一
  • 用yarn替代npm
  • spring boot 整合apache shiro
  • linux用户操作
  • JS 中的深拷贝与浅拷贝
  • [译]CSS 居中(Center)方法大合集
  • CSS盒模型深入
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Effective Java 笔记(一)
  • es6要点
  • iOS | NSProxy
  • JavaScript设计模式之工厂模式
  • laravel with 查询列表限制条数
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • SSH 免密登录
  • Vue2.0 实现互斥
  • vue总结
  • 关于springcloud Gateway中的限流
  • 回流、重绘及其优化
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 最简单的无缝轮播
  • 组复制官方翻译九、Group Replication Technical Details
  • #NOIP 2014# day.1 T2 联合权值
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (二)windows配置JDK环境
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (七)Java对象在Hibernate持久化层的状态
  • (三)Honghu Cloud云架构一定时调度平台
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net core 依赖注入的基本用发
  • .NET/C# 使窗口永不获得焦点
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .net流程开发平台的一些难点(1)
  • .Net中的集合
  • .NET中的十进制浮点类型,徐汇区网站设计
  • ?php echo ?,?php echo Hello world!;?
  • @property括号内属性讲解
  • @requestBody写与不写的情况
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林