AC日记——「HNOI2017」单旋 LiBreOJ 2018
思路:
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的更多相关文章
- AC日记——「HNOI2017」礼物 LiBreOJ 2020
#2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...
- AC日记——「SCOI2016」幸运数字 LiBreOJ 2013
「SCOI2016」幸运数字 思路: 线性基: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20005 # ...
- AC日记——「SCOI2016」背单词 LiBreOJ 2012
#2012. 「SCOI2016」背单词 思路: Orz: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...
- AC日记——「SCOI2015」国旗计划 LiBreOJ 2007
#2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define ma ...
- AC日记——「SDOI2017」序列计数 LibreOJ 2002
「SDOI2017」序列计数 思路: 矩阵快速幂: 代码: #include <bits/stdc++.h> using namespace std; #define mod 201704 ...
- 「AHOI / HNOI2017」单旋
「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...
- AC日记——「SCOI2016」美味 LiBreOJ 2016
#2016. 「SCOI2016」美味 思路: 主席树: 代码: #include <bits/stdc++.h> using namespace std; #define maxa 26 ...
- AC日记——「SCOI2015」情报传递 LiBreOJ 2011
#2011. 「SCOI2015」情报传递 思路: 可持久化树状数组模板: 代码: #include <bits/stdc++.h> using namespace std; #defin ...
- AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006
「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...
随机推荐
- Consul 入门
1. 什么是Consul? Consul 有很多组件,对于整体来说,它是一个服务发现和服务配置的工具,它提供了一下特性: 服务发现 健康检查 KV存储 多数据中心 2.安装Consul 以下是在 Ce ...
- [codeforces/edu2]总结(F)
链接:http://codeforces.com/contest/600 A题: 字符串处理. B题: sort+upper_bound C题: 统计一下每种字符的个数,然后贪心. (1) 如果没有奇 ...
- 题解【luoguP1351 NOIp提高组2014 联合权值】
题目链接 题意:给定一个无根树,每个点有一个权值.若两个点 \(i,j\) 之间距离为\(2\),则有联合权值 \(w_i \times w_j\).求所有的联合权值的和与最大值 分析: 暴力求,每个 ...
- SQL Server2000安装教程图解
sql2000安装教程图解... ================================= 第一部分:下载所需要的安装包: 可以自己在网上百度了之后下载--或是直接从我已打包好的群里下载 = ...
- [技巧篇]02.关于MyBatis存取图片到MySQL数据Blob字段
- [C#] 类型学习笔记一:CLR中的类型,装箱和拆箱
在学习.NET的时候,因为一些疑问,让我打算把.NET的类型篇做一个总结.总结以三篇博文的形式呈现. 这篇博文,作为三篇博文的第一篇,主要探讨了.NET Framework中的基本类型,以及这些类型一 ...
- 动态规划:LIS
题目中的严格二字,表示的意思是不允许≥或者是≤的情况出现,只允许>的情况以及<的情况 经典问题是NOIP合唱队形,在这个题目中,既求了最长上升子序列,也求了最长下降子序列 其最终的结果由两 ...
- 【Foreign】数据结构C [线段树]
数据结构C Time Limit: 20 Sec Memory Limit: 512 MB Description Input Output Sample Input Sample Output H ...
- bzoj3172 Ac自动机
根据fail树的性质 我们在建树的时候每建一个串就将他路径上的点全部加1表示这个串的后缀又出现了一次 然后从下到上把sum加起来就可以得到答案了 #include<cstdio> #inc ...
- CSS animation怎么使用?(山东数漫江湖)
animation可以为很多CSS属性添加动画,比如: color, background-color, height和width.animation的动画需要使用@keyframes来定义,随后被a ...