传送门

依然是一道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();
     ;
 }

最新文章

  1. 向mysql中插入Date类型的数据
  2. VS2015 安装mvc4安装包以及vs2010 sp1后导致Razor语法失效代码不高亮(能正常运行)/视图页面无法智能提示(.cshtml)解决办法
  3. Android开发者必须掌握的知识技能清单
  4. 如何优化cocos2d程序的内存使用和程序大小:第一部分
  5. java笔记--策略模式和简单工厂模式
  6. C#对XML进行操作(添加、修改)
  7. 一个mysql开启多个端口
  8. Vim,一个开放源代码的文本编辑器(转)
  9. Oracle alter index rebuild 与 ORA-08104 说明
  10. delphi 如何关闭 Unsafe typecast of 和 Unsafe type 的waring
  11. bzoj 1925 [Sdoi2010]地精部落(DP)
  12. Mysql表锁定解决
  13. oracle去除字符串中间的空格
  14. UNIX网络编程——套接字选项(SO_REUSEADDR)
  15. poj 2115 Matrix
  16. python的格式化输出
  17. 10个最好的免费PS图象处理软件方案
  18. vue重要项目的参考
  19. linux内核升级5.0
  20. 更新image的方法

热门文章

  1. jQuery升级踩坑大全
  2. 为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?
  3. 新玩具---Amazon Kindle PaperWhite 2
  4. (404) 未找到 获取StatusCode状态码
  5. Learning to Rank 简介
  6. Keepalived+Redis高可用部署
  7. [转]使用Sencha Ext JS 6打造通用应用程序
  8. 【POJ 1228】Grandpa&#39;s Estate 凸包
  9. 谈谈MVC项目中的缓存功能设计的相关问题
  10. REST服务中的异常处理