传送门

依然是一道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. HttpClient4.5 SSL访问工具类

    要从网上找一个HttpClient SSL访问工具类太难了,原因是HttpClient版本太多了,稍有差别就不能用,最后笔者干脆自己封装了一个访问HTTPS并绕过证书工具类. 主要是基于新版本Http ...

  2. Servicestack IRequestLogger获取 IHttpRequest

    我在 ServiceStack里实现了 Logging 中的请求与返回,同时我想在IRequestLogger.Log() 方法中获取 IHttpRequest . IRequestContext 并 ...

  3. iOS- -安装cocopods

    已经不是第一次安装cocoapods了, 但是今天在自己的mac pro 安装cocoapods 出现了 Error installing pods:active support requires R ...

  4. difference between append and appendTo

    if you need append some string to element and need set some attribute on these string at the same ti ...

  5. 《Javascript DOM编程艺术》 读书笔记 —— 好书,通俗易懂!!!!! 相当的严谨!!!!

    1.javascript弱类型语言,解释性语言. 2.javascript数据类型:字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空( ...

  6. Eclipse运行内存溢出

    VM arguments中添加如下: -Xms512m-Xmx1024m-XX:PermSize=256m-XX:MaxPermSize=256m-Xmn128m

  7. elasticsearch和hadoop集成,gateway.type hdfs设置

    配置elasticsearch的存储路径为hdfs需要两步,安装插件 elasticsearch-hadoop,在联网的情况下在命令窗口运行:plugin -install elasticsearch ...

  8. asp.net捕获全局未处理异常的几种方法

    通过HttpModule来捕获未处理的异常[推荐] 首先需要定义一个HttpModule,并监听未处理异常,代码如下: public void Init(HttpApplication context ...

  9. .net的Hello World之旅

    class Program    {        //这是主函数,是程序的入口        static void Main(string[] args)        {            ...

  10. 素数筛 poj 2689

    素数筛 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ...