传送门

依然是一道splay的区间操作,需要注意的是要把下标离散化后来表示splay的节点,我不知道怎么搞所以索性弄了个$ValuetoNode$,看样子没什么问题,

感觉他那个传下标的方法太暴力了..应该可以优化

 //BZOJ 1552
 //by Cydiater
 //2016.9.7
 #include <iostream>
 #include <cstdio>
 #include <cstring>
 #include <string>
 #include <algorithm>
 #include <queue>
 #include <map>
 #include <ctime>
 #include <cmath>
 #include <iomanip>
 #include <cstdlib>
 using namespace std;
 #define ll long long
 #define up(i,j,n)       for(int i=j;i<=n;i++)
 #define down(i,j,n)     for(int i=j;i>=n;i--)
 ;
 const int oo=0x3f3f3f3f;
 inline int read(){
     ,f=;
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 ,root=,tol=,ValuetoNode[MAXN],q[MAXN],head,tail;
 struct _data{
     int id,v;
 }a[MAXN];
 struct SplayTree{
     ],fa,siz,v,tag;
 }t[MAXN];
 namespace solution{
     inline ]==node;}
     inline bool cmp(_data x,_data y){return x.v==y.v?x.id<y.id:x.v<y.v;}
     inline bool re_cmp(_data x,_data y){return x.id<y.id;}
     void updata(int node){
         if(node){
             t[node].siz=;
             ])t[node].siz+=t[t[node].son[]].siz;
             ])t[node].siz+=t[t[node].son[]].siz;
         }
     }
     void downit(int node){
         if(t[node].tag){
             ],rightson=t[node].son[];
             ;;
             swap(t[node].son[],t[node].son[]);
             t[node].tag=;
         }
     }
     void rotate(int node){
         int old=t[node].fa,oldf=t[old].fa,which=get(node);
         t[old].son[which]=t[node].son[which^];t[t[old].son[which]].fa=old;
         t[old].fa=node;t[node].son[which^]=old;t[node].fa=oldf;
         ]]=node;
         updata(old);updata(node);
     }
     void build(int leftt,int rightt,int node,int fa){
         if(leftt==rightt){
             t[node].v=a[leftt].v;t[node].fa=fa;t[node].son[]=t[node].son[]=;
             t[node].siz=;ValuetoNode[a[leftt].v]=node;t[node].tag=;
             return;
         }
         t[node].tag=;
         t[node].fa=fa;;
         t[node].v=a[mid].v;ValuetoNode[a[mid].v]=node;
         >=leftt){
             t[node].son[]=++tol;build(leftt,mid-,tol,node);
         }
         <=rightt){
             t[node].son[]=++tol;build(mid+,rightt,tol,node);
         }
         updata(node);
     }
     void splay(int node,int aim){
         for(int fa;(fa=t[node].fa);rotate(node)){
             if(node==aim)break;
             if(t[node].fa==aim){
                 rotate(node);
                 break;
             }
             if(t[fa].fa==aim){
                 rotate(get(node)==get(fa)?fa:node);
                 rotate(node);
                 break;
             }
             if(t[fa].fa!=aim)rotate(get(node)==get(fa)?fa:node);
         }
         if(aim==root)root=node;
     }
     int find(int num){
         int now=root;
         ){
             downit(now);
             ]?t[t[now].son[]].siz:);
             ];
             else{
                 )return now;
                 num-=(tmp+);
                 now=t[now].son[];
             }
         }
     }
     void init(){
         N=read();
         a[].v=oo;a[].id=;
         up(i,,N+){
             a[i].v=read();
             a[i].id=i;
         }N++;
         a[++N].v=oo;a[N].id=N;
         sort(a+,a+N+,cmp);
         up(i,,N)a[i].v=++cnt;//sort by value
         root=++tol;
         sort(a+,a+N+,re_cmp);
         build(,N,root,);
     }
     void slove(){
         up(i,,N-){
             int node=ValuetoNode[i];
             head=;tail=;q[++tail]=node;;
             int tmp=t[node].fa;
             while(tmp!=root){
                 q[++tail]=tmp;
                 tmp=t[tmp].fa;
             }q[++tail]=root;
             while(head<=tail){
                 tmp=q[tail--];
                 downit(tmp);
             }
             splay(node,root);right_siz=t[t[root].son[]].siz+;
             printf();)printf(" ");
             int leftt=find(i),rightt=find(right_siz);
             splay(leftt,root);splay(rightt,t[root].son[]);
             ];
             t[Son].tag^=;

         }
         puts("");
     }
 }
 int main(){
     //freopen("input.in","r",stdin);
     using namespace solution;
     init();
     slove();
     ;
 }

BZOJ3506/1502 [CQOI2014]排序机械臂的更多相关文章

  1. 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)

    点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...

  2. P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1​ ,并把左起第一个物品至 P1P_1P1 ...

  3. 洛谷P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...

  4. bzoj3506 [Cqoi2014]排序机械臂

    bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...

  5. BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...

  6. [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)

    Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...

  7. [bzoj1552][Cerc2007]robotic sort&&[bzoj3506][Cqoi2014]排序机械臂

    非常垃圾的一道平衡树,结果被日了一天.很难受嗷嗷嗷 首先不得不说网上的题解让我这个本来就不熟悉平衡树的彩笔很难受——并不好理解. 还好Sinogi大佬非常的神,一眼就切掉了,而且用更加美妙的解法. 题 ...

  8. Luogu P3165 [CQOI2014]排序机械臂

    先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...

  9. 【洛谷 P3165】 [CQOI2014]排序机械臂 (Splay)

    题目链接 debug了\(N\)天没debug出来,原来是找后继的时候没有pushdown... 众所周知,,Splay中每个编号对应的节点的值是永远不会变的,因为所有旋转.翻转操作改变的都是父节点和 ...

随机推荐

  1. 创业这三年¥.NET之尴尬处境

    创业这三年#迈出第一步 创业这三年@各种奇遇 之前写的文章有兴趣的大家可以看看. 本来没有打算写这样一篇会遭人拍砖的文章,但是发现大家每天忙于编码,对市场环境..Net生态没有一个真实.多角度的认识, ...

  2. unity3d Vector3.Lerp解析

    Vector3.Lerp:http://www.ceeger.com/Script/Vector3/Vector3.Lerp.html 手册中描述的不是很详细,什么叫“按照数字t在from到to之间插 ...

  3. Tensorflow学习笔记2:About Session, Graph, Operation and Tensor

    简介 上一篇笔记:Tensorflow学习笔记1:Get Started 我们谈到Tensorflow是基于图(Graph)的计算系统.而图的节点则是由操作(Operation)来构成的,而图的各个节 ...

  4. RHCE实验环境|rhel7-lab

    教学环境说明: 1.yum源地址是:http://content.example.com 2.网卡都用同一个,且自定义网卡! 3.网络配置参考 classroom IP 172.25.254.254/ ...

  5. Beta版本冲刺Day6

    会议讨论: 628:配置Mysql的时候遇到了问题,在修改数据库用户密码时无法修改,并且服务器好像连接不上去了,其他组员则继续他们的任务.601:将一些原来的界面进行了修改,修改成了更加美观的外形. ...

  6. 【Quartz】Quartz的搭建、应用(单独使用Quartz)

    Quartz在Java构建的系统中,是十分常用的定时任务框架. 本文,记录.介绍Quartz的简单入门的单独搭建(此文入门学习Quartz为主,并非基于Spring托管形式). > 参考的优秀资 ...

  7. MySQL删除/更新数据时报1175错误

    今天删除MySQL数据库中的一条记录的时候,一直不能删除,提示错误信息如下: Error Code: 1175. You are using safe update mode and you trie ...

  8. you-get中文说明

    来源于:https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E You-Get 乃一小小哒命令行程序, ...

  9. Android中图片的处理(放大缩小,去色,转换格式,增加水印等)(转)

    原文地址:http://menxu.lofter.com/post/164b9d_3ebf79 package com.teamkn.base.utils; import java.io.ByteAr ...

  10. git 保存用户名和密码

    打开TortoiseGit控制面板 点击 Edit global .gitconfig文件 添加 [credential] helper = store OK了 你再登录一次之后密码就被记住了