http://acm.fzu.edu.cn/problem.php?pid=2022

刚开始MLE,用map对应,果断爆内存了,然后改用去重,离散化, lowbound查找元素位置,速度还不错,不过pushup写也是醉了,一遍遍错,最后发现

if(o[rt].left==INF||o[rt].right==INF||o[rt].left==o[rt].right)l=INF;这一句第三个判断必须加,发现这样可以避免那种只由一个点往上更新的错误,也是非常的伤感。。。。。

/*96655 's source code for D
Memory: 30072 KB Time: 265 MS
Language: GNU C++ Result: Accepted
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
const int maxn=+;
const int INF=1e9+;
struct asd
{
int x;
char c;
} q[maxn];
bool vis[maxn];
int a[maxn];
struct node
{
int left,right,v;
} o[maxn<<];
void pushup(int rt)
{
o[rt].left=min(o[rt*].left,o[rt*+].left);
if(o[rt*+].right!=INF) o[rt].right=o[rt*+].right;
else o[rt].right=o[rt*].right;
int l=fabs(o[rt*].right-o[rt*+].left);
if(o[rt].left==INF||o[rt].right==INF||o[rt].left==o[rt].right)l=INF;
o[rt].v=min(min(o[rt*].v,o[rt*+].v),l);
}
void build(int rt,int l,int r)
{
if(l==r)
{
o[rt].left=o[rt].right=o[rt].v=INF;
return;
}
int m=(l+r)>>;
build(rt*,l,m);
build(rt*+,m+,r);
pushup(rt);
}
void change(int rt,int l,int r,int pos,int p)
{
if(l==r)
{
if(p)o[rt].left=o[rt].right=a[l-];
else o[rt].left=o[rt].right=INF;
return;
}
int m=(l+r)>>;
if(pos<=m)change(rt*,l,m,pos,p);
else change(rt*+,m+,r,pos,p);
pushup(rt);
}
int main()
{
int T;
char s[];
while(~scanf("%d",&T))
{
int cnt=,sum=,k=;
for(int i=; i<=T; ++i)
{
scanf("%s",s);
q[i].c=s[];
if(s[]=='m')continue;
scanf("%d",&q[i].x);
a[k++]=q[i].x;
}
sort(a,a+k);
for(int i=; i<k; i++)
if(a[i]!=a[i-])a[cnt++]=a[i];
build(,,cnt);
memset(vis,,sizeof(vis));
for(int i=; i<=T; i++)
{
if(q[i].c=='a')
{
int pos=lower_bound(a,a+cnt,q[i].x)-a;
pos++;
if(vis[pos])continue;
vis[pos]=;
++sum;
change(,,cnt,pos,);
}
else if(q[i].c=='d')
{
int pos=lower_bound(a,a+cnt,q[i].x)-a;
pos++;
if(!vis[pos])continue;
vis[pos]=;
--sum;
change(,,cnt,pos,);
}
else
{
if(sum<)printf("0\n");
else printf("%d\n",o[].v);
}
}
}
return ;
}

唯一值得欣慰的是速度还不错。。。。QAQ

FOJ2022车站 线段树区间合并的更多相关文章

  1. POJ 3667 Hotel(线段树 区间合并)

    Hotel 转载自:http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html [题目链接]Hotel [题目类型]线段树 ...

  2. HDU 3911 线段树区间合并、异或取反操作

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3911 线段树区间合并的题目,解释一下代码中声明数组的作用: m1是区间内连续1的最长长度,m0是区间内连续 ...

  3. HDU 3911 Black And White(线段树区间合并+lazy操作)

    开始以为是水题,结果...... 给你一些只有两种颜色的石头,0为白色,1为黑色. 然后两个操作: 1 l r 将[ l , r ]内的颜色取反 0 l r 计算[ l , r ]内最长连续黑色石头的 ...

  4. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  5. poj3667 线段树 区间合并

    //Accepted 3728 KB 1079 ms //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  6. hdu3911 线段树 区间合并

    //Accepted 3911 750MS 9872K //线段树 区间合并 #include <cstdio> #include <cstring> #include < ...

  7. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  8. HDU 3308 LCIS (线段树区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题目很好懂,就是单点更新,然后求区间的最长上升子序列. 线段树区间合并问题,注意合并的条件是a[ ...

  9. SPOJ GSS1_Can you answer these queries I(线段树区间合并)

    SPOJ GSS1_Can you answer these queries I(线段树区间合并) 标签(空格分隔): 线段树区间合并 题目链接 GSS1 - Can you answer these ...

随机推荐

  1. Linux查看机器型号

    dmidecode | grep “Product Name”

  2. go学习资料及优秀博文

    相关书籍: Go Web编程 http://blog.csdn.net/broadview2006/article/details/8875097 优秀博文: 系统编程语言明日之星—Go(http:/ ...

  3. 解决不安装VC运行库(VC2005,VC2008),程序运行出错的方法

    因为VS2005以后程序采用了manifest的生成方式,所以发布的时候要和运行库一起发布.但是我们平时开发和发布的时候如果都要客户安装运行库,那就不太方便了.你可以Microsoft下载:http: ...

  4. 开源入侵检测系统OSSEC搭建之二:客户端安装

    上一篇文章中已经将OSSEC服务端的安装以及客户端的Key导出操作做了解说,接下来在另一台虚拟机中安装客户端,与安装服务端类似同样需要安装ossec,步骤如下. 一.下载ossec-hids-2.8. ...

  5. 嵌入式控制(0)----linux系统网络配置

    嵌入式系统本身具有操作系统的全部属性,但收到其硬件条件制约,故需要主机通过串口/网口等方式与其通信.今日下午的工作主要是linux系统的ssh传输配置,nfs服务器配置,tftp服务器配置. ip的概 ...

  6. Java API —— 递归

    1.方法定义中调用方法本身的现象 2.递归注意实现         1) 要有出口,否则就是死递归         2) 次数不能太多,否则就内存溢出         3) 构造方法不能递归使用 3. ...

  7. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...

  8. 连续多行输入--C++ 中字符串标准输入的学习及实验(续篇)

      编程中常常会用到连续多行输入的情况,如果事先知道要输入多少行的话,可以直接定义一个变量,然后用循环就可以实现了,但有时候事先并不知道,要输入多少行,于是就可以用到输入流碰到文件终止符的情况了,具体 ...

  9. Mac系统在终端中查看CPU信息的命令

    在mac os x的终端中以命令行的形式查看本机cpu信息: sysctl -n machdep.cpu.brand_string E.G. lis-mbp:Home jenkins$ sysctl ...

  10. Oracle的rownum原理和使用(整理几个达人的帖子)

    整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...