题目大意

  随着时间的推移这里有几个任务对应着一段区间。每次要将任务安到时间线上时,要把时间线上已有的与该任务对应区间有交集的区间对应的任务删去。求每次删去的区间个数,以及整个时间线上有几个任务。时间线长度m<=100000,任务个数n<=200000

题解

  对于一个新加入的区间,我们要从右往左枚举每一个左端点小于等于新区间右端点的任务,直到枚举到了一个任务其右端点小于新任务的左端点。对于每一个要枚举到的任务,我们要尽可能缩小找到它的时间复杂度。于是建立一个权值树状数组,key值时间,值是左端点位于该点的任务个数。其维护的就是左端点个数的前缀和了,它满足单调性。左端点所在的地方就是权值增加的地方,而对于一个新区间,新区间右端点所在的权值前缀和就是离该点左侧的第一个左端点所在位置的权值前缀和。于是我们可以轻松用LowerBound得到区间,就这样不断删除二分删除二分(我们对于每一个左端点整一个数组维护其对应的右端点),直到有一个区间右端点小于新区间左端点为止。极端复杂度$O(n^2 \log m)$。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_LEN = 100010, TotLen = 100000;
int LmatchR[MAX_LEN]; struct BST
{
private:
int C[MAX_LEN];
int N; int Lowbit(int x)
{
return x & -x;
} public:
BST(int n):N(n){} int Query(int p)
{
int ans = 0;
while (p > 0)
{
ans += C[p];
p -= Lowbit(p);
}
return ans;
} void Update(int p, int delta)
{
while (p <= N)
{
C[p] += delta;
p += Lowbit(p);
}
}
}g(TotLen); int PrefixFind; bool GtPrefixFind(int k)
{
return g.Query(k) >= PrefixFind;
} int LowerBound(int l, int r, bool(*InRange)(int))
{
if (!InRange(r))
return -1;
while (l < r)
{
int mid = (l + r) / 2;
if (InRange(mid))
r = mid;
else
l = mid + 1;
}
return l;
} int main()
{
int qCnt;
scanf("%d", &qCnt);
while (qCnt--)
{
char op;
int newL, newR, curL, delCnt;
scanf("\n%c", &op);
switch (op)
{
case 'A':
scanf("%d%d", &newL, &newR);
delCnt = 0;
while (true)
{
PrefixFind = g.Query(newR);
if (PrefixFind == 0)
break;
curL = LowerBound(1, newR, GtPrefixFind);
if (curL == -1)
break;
if (LmatchR[curL] >= newL)
{
delCnt++;
g.Update(curL, -1);
}
else
break;
}
g.Update(newL, 1);
LmatchR[newL] = newR;
printf("%d\n", delCnt);
break;
case 'B':
printf("%d\n", g.Query(TotLen));
break;
}
}
}

  

luogu2161 [SHOI2009]会场预约的更多相关文章

  1. Luogu2161 [SHOI2009]会场预约-线段树

    Solution 线段树维护 sum 表示区间内预约个数, L 表示区间最左边的预约, R 表示区间最右边的预约. $pushup$ 就是这样 : void up(int nd) { sum[nd] ...

  2. 【题解】P2161[SHOI2009]会场预约(set)

    [题解][P2161 SHOI2009]会场预约 题目很像[[题解]APIO2009]会议中心 \(set\)大法好啊! 然后我们有个小\(trick\)(炒鸡帅),就是如何优雅地判断线段交? str ...

  3. [LuoguP2161[ [SHOI2009]会场预约 (splay)

    题面 传送门:https://www.luogu.org/problemnew/show/P2161 Solution splay 的确有线段树/树状数组的做法,但我做的时候脑残没想到 我们可以考虑写 ...

  4. 2021.12.08 [SHOI2009]会场预约(平衡树游码表)

    2021.12.08 [SHOI2009]会场预约(平衡树游码表) https://www.luogu.com.cn/problem/P2161 题意: 你需要维护一个 在数轴上的线段 的集合 \(S ...

  5. [SHOI2009] 会场预约 - Treap

    Description PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也 ...

  6. BZOJ2028: [SHOI2009]会场预约(set)

    Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 425  Solved: 213[Submit][Status][Discuss] Description ...

  7. P2161 [SHOI2009]会场预约

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  8. P2161 [SHOI2009]会场预约 (线段树:线段树上的不重复覆盖数)

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  9. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

随机推荐

  1. java中String类为什么要设计成final?

    1 将方法或类声明为final主要目的是:确保它们不会在子类中改变语义.String类是final类,这意味着不允许任何人定义String的子类. String基本约定中最重要的一条是immutabl ...

  2. [ SDOI 2009 ] HH的项链 & [ HEOI 2012 ] 采花

    \(\\\) \(Description\) 给出一个长为\(N\)的序列,\(M\)次询问区间\([L_i,R_i]\)内不同数字的个数. \(N\in [1,5\times 10^4]\),\(M ...

  3. bootstrap图标乱码问题-解决方案

    楼主在使用bootstrap时,出现了图标乱码问题,经过多次查找,才解决了问题(最后发现真的是很好解决的问题(^^)) 如果出现乱码 请直接在自己写的CSS中重新引入一下font文件中的字体就好了 @ ...

  4. 既可以输入也可以选择的input框

    datalist 是h5中既可以选择也可以输入的属性 具体代码如下 <input list="datalist"/><datalist id="data ...

  5. 【译】x86程序员手册18-6.3.1描述符保存保护参数

    6.3 Segment-Level Protection 段级保护 All five aspects of protection apply to segment translation: 段转换时会 ...

  6. pptp服务故障

    pptp服务故障记录 原文地址:http://www.cnblogs.com/caoguo/p/4994512.html 1.pptp部署是遇到开了防火墙端口不能拨号,拨号是提示错误如下: 但是关闭防 ...

  7. HDU_1087_Super Jumping! Jumping! Jumping!_dp

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  8. js获得子节点, 获得tab转json值

    //提取表格的值,JSON格式 function GetTableData(table) { var tableData = new Array(); //创建数组 alert("行数:&q ...

  9. if({1,0}, , )

    =VLOOKUP(F2,IF({1,0},D2:D10,C2:C10),2,),用F2作为查找条件,对D列进行查找,如果改成{0,1}则是对C列为查找范围.返回内存数组,对F2进行精确查找. 为什么写 ...

  10. Eclipse调试DEBUG时快速查看某个变量的值的快捷键

    ctrl+shift+i