Description

Input

Output

Sample Input

7 10

1

2

3

0 1 2

0 4 7

0 2 5

20

0 6 6

99

0 4 6

Sample Output

1

2

2

1

3

Data Constraint

对于30%的数据,N<=10^5,Q<=1000

对于100%的数据,N<=10^9,Q<=10^5

Solution

  • 这题显然是一道线段树的题啦!不过却有许多细节要注意。

  • 首先,将一个人的占据视为阻隔,那么一个区间需要维护几个值:

    1. 此区间内最大区间的长度
    2. 此区间内最大区间的起始位置
    3. 从左向右扩展的最大长度
    4. 从右向左扩展的最大长度
    5. 此区间内被占据的个数
  • 那么,合并区间的方法就显而易见了,人的进入就相当于单点修改。

  • 但由于区间有 10910^9 那么大,所以必须动态开点,以编号为下标储存。

  • 另外每个人的坐标无序,用 Hash 处理即可。

  • 一个人插入的位置就是当前根节点的②值、加上①值除以2,

  • 同时用一个数组记录,以便其离开时查找。

  • 那么总时间复杂度就是优美的 O(QlogN) 。

Code

#include<cstdio>
using namespace std;
const int N=100001,mo=1e6+7;
struct data
{int l,r,ls,rs,ml,mx,n;
}f[N*33];
int tot,ans;
int h[mo],g[mo];
bool b[mo];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
inline int hash(int x)
{int y=x%mo;while(h[y] && h[y]!=x) y=(y+1)%mo;return y;
}
inline void add(int v,int l,int r)
{f[v].ml=l;f[v].l=f[v].r=f[v].mx=r-l+1;
}
inline void find(int v,int l,int r,int x,int y)
{if(l==x && r==y){ans+=f[v].n;return;}int mid=(l+r)>>1;if(!f[v].ls) add(f[v].ls=++tot,l,mid);if(!f[v].rs) add(f[v].rs=++tot,mid+1,r);if(y<=mid) find(f[v].ls,l,mid,x,y); elseif(x>mid) find(f[v].rs,mid+1,r,x,y); else{find(f[v].ls,l,mid,x,mid);find(f[v].rs,mid+1,r,mid+1,y);}
}
inline void change(int v,int l,int r,int x,int y)
{if(l==r){f[v].n+=y;if(y>0) f[v].l=f[v].r=f[v].ml=f[v].mx=0; else{f[v].ml=l;f[v].l=f[v].r=f[v].mx=1;}return;}int mid=(l+r)>>1;if(!f[v].ls) add(f[v].ls=++tot,l,mid);if(!f[v].rs) add(f[v].rs=++tot,mid+1,r);int ls=f[v].ls,rs=f[v].rs;if(x<=mid) change(ls,l,mid,x,y); else change(rs,mid+1,r,x,y);f[v].n=f[ls].n+f[rs].n;f[v].l=f[ls].l;if(f[v].l==mid-l+1) f[v].l+=f[rs].l;f[v].r=f[rs].r;if(f[v].r==r-mid) f[v].r+=f[ls].r;if(f[ls].mx>f[rs].mx){f[v].mx=f[ls].mx;f[v].ml=f[ls].ml;}else{f[v].mx=f[rs].mx;f[v].ml=f[rs].ml;}if(f[ls].r+f[rs].l>f[v].mx || f[ls].r+f[rs].l==f[v].mx && mid-f[ls].r+1>f[v].ml){f[v].mx=f[ls].r+f[rs].l;f[v].ml=mid-f[ls].r+1;}
}
int main()
{int n=read(),q=read();add(tot=1,1,n);while(q--){int p=read();if(!p){int l=read(),r=read();ans=0;find(1,1,n,l,r);printf("%d\n",ans);continue;}int k=hash(p);if(!h[k]) h[k]=p;if(!b[k]){b[k]=true;change(1,1,n,g[k]=f[1].ml+f[1].mx/2,1);}else{change(1,1,n,g[k],-1);b[k]=g[k]=0;}}return 0;
}

BZOJ 3740. 【TJOI2014】电源插排相关推荐

  1. 【刷题】BZOJ 5154 [Tjoi2014]匹配

    Description 有N个单身的男孩和N个单身女孩,男孩i和女孩j在一起得到的幸福值为Hij.一个匹配即对这N个男孩女孩的安排: 每个男孩恰好有一个女朋友,每个女孩恰好有一个男朋友.一个匹配的幸福 ...

  2. 每周记录(4月底停更了qvq)

    1月6日 旋转卡壳 闵可夫斯基和 1月13日 期末复习 1月20日 网络流前4道题 一场失败的期末考试 写寒假作业 bzoj [HNOI2008]明明的烦恼(90分) prufer序列 正睿 画画图 ...

  3. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  4. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  5. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  6. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

    题意 有 \(n\) 个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪. 因此,对于不同的开枪顺序,最后死的人也不同. 问最 ...

  7. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  8. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  9. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁"树状图" Time Limit: 25 Sec  Memory Limit: 512 MB Submit: 53  Solved: 9 [Su ...

最新文章

  1. 【动画2】CALayer动画
  2. 动态主机配置协议服务器不能提供,计算机网络基础课程—动态主机配置协议(Dhcp)...
  3. C 语言编程 — 程序的装载与运行
  4. SCII码表 键盘常用ASCII码
  5. 手机端设置https访问代理(windows)
  6. 【Python相关】Vaex :突破pandas,快速分析100GB大数据集
  7. linux 单步启动_Linux系统的启动
  8. Ubuntu android 开发配置
  9. drool 7.x 属性:duration
  10. 编程界的十大天神,都来拜一拜吧
  11. ASP.NET设置背景图案
  12. 功能测试数据测试之错误推测方法
  13. Java使用aspose生成简历
  14. 令人头大的慢查询分析
  15. mysql 5.7.22 winx64_MySQL 5.7.22 winx64 安装配置方法图文教程
  16. 人生若只如初见 何事秋风悲画扇
  17. SAP中使用LSMW批量导入总账科目
  18. php课设源代码网站,php精品课程教学网站在线发布系统
  19. 托马斯插件_托马斯·爱迪生讨厌的营销策略
  20. CTS/RTS/DSR/DTR

热门文章

  1. Keras学习笔记:函数式模型
  2. Sublime Text
  3. 常见缓存算法和LRU与LFU的c++实现
  4. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170408
  5. [MATLAB学习笔记] global声明全部变量
  6. 吐血整理!这可能是最全的机器学习工具手册
  7. c轴 t轴 l轴_从事数控工作的你知道3轴、3+2轴定位与5轴联动的区别吗?
  8. 独立成分分析ICA系列3:直观解释与理解
  9. 解决PowerDesigner 16 Generate Datebase For Sql2005/2008 对象名sysproperties无效的问题
  10. C#中深拷贝对象的简单方法