#2018. 「HNOI2017」单旋

思路:

  set+线段树;

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxtree maxn<<2
int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree];
int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn][],f[maxn],root;
set<int>Set;
inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'')Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
}
void build(int now,int l,int r)
{
L[now]=l,R[now]=r;if(l==r) return;mid[now]=l+r>>;
build(now<<,l,mid[now]),build(now<<|,mid[now]+,r);
}
inline void pushdown(int now)
{
val[now<<]+=tag[now],tag[now<<]+=tag[now];
val[now<<|]+=tag[now],tag[now<<|]+=tag[now];
tag[now]=;
}
void add(int now,int l,int r)
{
if(L[now]>=l&&R[now]<=r)
{
val[now]++,tag[now]++;
return;
}
if(tag[now]!=) pushdown(now);
if(l<=mid[now]) add(now<<,l,r);
if(r>mid[now]) add(now<<|,l,r);
}
void Minus(int now,int l,int r)
{
if(L[now]>=l&&R[now]<=r)
{
val[now]--,tag[now]--;
return;
}
if(tag[now]!=) pushdown(now);
if(l<=mid[now]) Minus(now<<,l,r);
if(r>mid[now]) Minus(now<<|,l,r);
}
int get(int to)
{
int l=,r=size,now=;
while(l!=r)
{
if(tag[now]!=) pushdown(now);
if(to<=mid[now]) r=mid[now],now=now<<;
else l=mid[now]+,now=now<<|;
}
return val[now];
}
void era(int to,int justval)
{
int l=,r=size,now=;
while(l!=r)
{
if(tag[now]!=) pushdown(now);
if(to<=mid[now]) r=mid[now],now=now<<;
else l=mid[now]+,now=now<<|;
}
val[now]=justval;
}
int main()
{
freopen("data.txt","r",stdin);
in(n);
for(int i=;i<=n;i++)
{
in(op[i]);
if(op[i]==) in(ki[i]),bi[++cnt]=ki[i];
}
sort(bi+,bi+cnt+),size=unique(bi+,bi+cnt+)-bi-,build(,,size);
int l,r,x,fa,cost;set<int>::iterator it,it_;
for(int i=;i<=n;i++)
{
if(op[i]==)
{
x=lower_bound(bi+,bi+size+,ki[i])-bi;
l=,r=,it=it_=Set.insert(x).first;
if(it!=Set.begin()) l=*(--it);
if(x!=*Set.rbegin()) r=*(++it_);
if(!l&&!r) root=x,cost=;
else if(l&&ch[l][]==) ch[l][]=x,f[x]=l,cost=get(l)+;
else if(r&&ch[r][]==) ch[r][]=x,f[x]=r,cost=get(r)+;
printf("%d\n",cost),era(x,cost);
}
if(op[i]==||op[i]==)
{
it=Set.begin(),x=*it;
if(x!=root)
{
printf("%d\n",get(x));
if(ch[x][]) Minus(,x+,f[x]-),ch[f[x]][]=ch[x][],f[ch[x][]]=f[x];
else ch[f[x]][]=;
ch[x][]=root,f[root]=x,f[x]=,root=x;
add(,,size),era(x,);
}
else printf("1\n");
if(op[i]==) root=ch[root][],f[root]=,Minus(,,size),Set.erase(it);
}
if(op[i]==||op[i]==)
{
it=Set.end(),x=*(--it);
if(x!=root)
{
printf("%d\n",get(x));
if(ch[x][]) Minus(,f[x]+,x-),ch[f[x]][]=ch[x][],f[ch[x][]]=f[x];
else ch[f[x]][]=;
ch[x][]=root,f[root]=x,f[x]=,root=x;
add(,,size),era(x,);
}
else printf("1\n");
if(op[i]==) root=ch[root][],f[root]=,Minus(,,size),Set.erase(it);
}
}
return ;
}

AC日记——「HNOI2017」单旋 LiBreOJ 2018的更多相关文章

  1. AC日记——「HNOI2017」礼物 LiBreOJ 2020

    #2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...

  2. AC日记——「SCOI2016」幸运数字 LiBreOJ 2013

    「SCOI2016」幸运数字 思路: 线性基: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20005 # ...

  3. AC日记——「SCOI2016」背单词 LiBreOJ 2012

    #2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  4. AC日记——「SCOI2015」国旗计划 LiBreOJ 2007

    #2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define ma ...

  5. AC日记——「SDOI2017」序列计数 LibreOJ 2002

    「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...

  6. 「AHOI / HNOI2017」单旋

    「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...

  7. AC日记——「SCOI2016」美味 LiBreOJ 2016

    #2016. 「SCOI2016」美味 思路: 主席树: 代码: #include <bits/stdc++.h> using namespace std; #define maxa 26 ...

  8. AC日记——「SCOI2015」情报传递 LiBreOJ 2011

    #2011. 「SCOI2015」情报传递 思路: 可持久化树状数组模板: 代码: #include <bits/stdc++.h> using namespace std; #defin ...

  9. AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006

    「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...

随机推荐

  1. mapper.xml配置读取不到

    通常我们在sping的配置文件中,扫描到mapper文件,但是mapper.xml找不到,此时解决办法就是在pom中添加下面代码: <resources> <resource> ...

  2. [lottery anayliser]lottery anayliser

    抓取网页,获得获奖信息 #!/usr/bin/python import urllib2 import re import time def spider(url): ""&quo ...

  3. [技巧篇]12.从Spring的编码过滤器说起

    有一枚学生问问了我一个问题,突然灵感爆发,他使用的Spring的过滤器,前台利用GET方式向后端发出一个请求,由于里面含有中文数据,结果在后端显示的是乱码,他问我为什么?明明在Spring里面也配了字 ...

  4. struts2常用标签之数据标签

    数据标签1  property标签  property标签的主要属性:  value:用来获取值的OGNL表达式,如果value属性值没有指定,那么将会被设定为top,也就是返回位于值栈最顶端的对象. ...

  5. 解决配置JAVA_HOME JDK版本不变的问题

    解决方案:修改环境变量Path 因为PATH环境变量中默认将system32等系统重要目录添加在最前面,所以运行java -version时当然是调用system32目录下的java.exe了. 所以 ...

  6. [BZOJ2440]完全平方数解题报告|莫比乌斯函数的应用

    完全平方数 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱.  这天是小X的生日 ...

  7. 【NOI】2004 郁闷的出纳员

    [算法]平衡树(treap) [题解] treap知识见数据结构. 解法,具体细节见程序. #include<cstdio> #include<algorithm> #incl ...

  8. Mayor's posters(线段树+离散化+区间染色)

    题目链接:http://poj.org/problem?id=2528 题目: 题意:将n个区间进行染色(对于同一个区间,后一次染色会覆盖上一次的染色),问最后可见的颜色有多少种. 思路:由于区间长度 ...

  9. 2017-2018-1 20179205《Linux内核原理与设计》第二周作业

    <Linux内核原理与分析>第二周作业 本周视频学习情况: 通过孟老师的视频教程,大致对风诺依曼体系结构有了一个初步的认识,视频从硬件角度和程序员角度对CPU和Main Memory(内存 ...

  10. C语言将字符串转换成对应的数字(十进制、十六进制)【转】

    转自:http://wawlian.iteye.com/blog/1315133 问题1:讲一个十进制数字的字符串表示转换成对应的整数.举例:将“”转换成整数1234. C代码 收藏代码 /*将字符串 ...