#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. maven的setting.xml文件中只配置本地仓库路径的方法

    maven的setting.xml文件中只配置本地仓库路径的方法 即:settings标签下只有一个 localRepository标签,其他全部注释掉即可 <?xml version=&quo ...

  2. pg_basebackup: invalid tar block header size

    问题: 在使用pg_basebackup搭建备节点时,由于pg_basebackup本身使用的是int整型来保存传输的数据大小,当传输的数据大于4G的话,整数就会溢出,进而报出:pg_baseback ...

  3. iOS AFNetworking 2.6.0框架导入报错解决方法

    最近手动导入AFNetworking 2.6.0框架时发现Xcode报如下3个错误: 1. Use of undeclared identifier ‘kSecFormatUnknown‘ 2. Us ...

  4. 洛谷:P3809 【模板】后缀排序(后缀数组模板)

    P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...

  5. [dhcpd]清除dhcp缓存

    修改了dhcp的default-lease-time && max-lease-time 清除缓存: rm /var/lib/dhcpd.leases~ echo "&quo ...

  6. Moodle插件开发——Blocks(版块)

    前提: 1)     基于Moodle3.0,要求Moodle版本高于2.0 2)     PHP编程基础:语言的了解和开发工具使用 有经验的开发人员和那些只是想程序员的参考文本应参阅附录A. 1.  ...

  7. 确保web安全的https、确认访问用户身份的认证(第七章、第八章)

    第七章 确保web安全的https 1.http的缺点: (1)通信使用明文,内容可能会被窃听 (2)不验证通信方的身份,因此有可能遭遇伪装 (3)无法证明报文的完整性,因此有可能已遭篡改. 2.通信 ...

  8. mysql无法通过ip地址链接

    用BitNami搭建个站点(内含mysql数据库服务.phpmyadmin和Apache web Service), 用localhost或127.0.0.1及用户名密码连接没有问题.但是本机或远程通 ...

  9. Jmeter-6-创建数据库测试计划

    1. 将mysql 的jdbc的jar包放到Jmeter lib的目录下. 2. 创建线程组. 3. 创建JDBC Connection Configuration, 提供详细的数据库配置信息. 4. ...

  10. Optimal Milking(POJ2112+二分+Dinic)

    题目链接:http://poj.org/problem?id=2112 题目: 题意:有k台挤奶机,c头奶牛,每台挤奶机每天最多生产m的奶,给你每个物品到其他物品的距离(除了物品到自己本省的距离为0外 ...