给出两种操作:

第i个0:在x位置插入一个长度为i的线段,并输出该线段共覆盖了多少之前增加的线段

1:删除第i次插入的线段

官方题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端点。 再查询有多少个线段的右端点大于该线段右端点, 两者之差就是答案。用两个树状数组搞定。时间复杂度nlog

思路非常好理解,直接用一个线段树记录区间的左端点和右端点就可以

#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std;
const int inf=0x7fffffff;
struct A
{
int op,l,r,x;
} a[400010]; struct Y
{
int x,id;
} y[400010]; struct Data
{
int l,r,a,b;
} data[1600010]; bool cmp(Y a,Y b)
{
return a.x<b.x;
} void build(int l,int r,int k)
{
data[k].l=l;
data[k].r=r;
data[k].a=data[k].b=0;
if (l==r) return ; int mid=(l+r)/2; build(l,mid,k*2);
build(mid+1,r,k*2+1);
} int query(int l,int r,int k,int op)
{
if (l>r) return 0;
if (data[k].l==l && data[k].r==r)
{
if (op==1) return data[k].a;
else return data[k].b;
} int mid=(data[k].l+data[k].r)/2; if (r<=mid) return query(l,r,k*2,op);
else if (l>mid) return query(l,r,k*2+1,op);
else return query(l,mid,k*2,op)+query(mid+1,r,k*2+1,op);
} void updata(int n,int k,int op,int x)
{
if (op==1) data[k].a+=x;
else data[k].b+=x; if (data[k].l==n && data[k].r==n) return ; if (n<=data[k*2].r) updata(n,k*2,op,x);
else updata(n,k*2+1,op,x);
} int main()
{
int Case,n,i,x,cnt;
Case=1;
while (scanf("%d",&n)!=EOF)
{
cnt=1; for (i=0; i<n; i++)
{
scanf("%d",&a[i].op);
if (a[i].op==0)
{
scanf("%d",&a[i].l);
a[i].r=a[i].l+cnt;
cnt++;
}
else
{
scanf("%d",&x);
x--;
a[i].x=x;
}
y[i*2].x=a[i].l;
y[i*2].id=-i-1;
y[i*2+1].x=a[i].r;
y[i*2+1].id=i+1; }
sort(y,y+n*2,cmp);
cnt=0;
if (y[0].id<0)
a[-y[0].id-1].l=0;
else
a[y[0].id-1].r=0; for (i=1; i<n*2; i++)
{
if (y[i].x!=y[i-1].x) cnt++;
if (y[i].id<0) a[-y[i].id-1].l=cnt;
else a[y[i].id-1].r=cnt;
} build(0,cnt,1); printf("Case #%d:\n",Case++);
int temp=0;
for (i=0; i<n; i++)
{
if (a[i].op==0)
{
printf("%d\n",query(a[i].l,cnt,1,1)-query(a[i].r+1,cnt,1,2));
updata(a[i].l,1,1,1);
updata(a[i].r,1,2,1);
a[temp].l=a[i].l;
a[temp].r=a[i].r;
temp++;
}
else
{
updata(a[a[i].x].l,1,1,-1);
updata(a[a[i].x].r,1,2,-1);
} }
} return 0;
}

HDU 5372 线段树的更多相关文章

  1. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  2. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  6. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  7. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. 【HDU】5249-KPI(线段树+离散化)

    好久没写线段树都不知道怎么写了... 很easy的线段树二分问题 #include<cstdio> #include<set> #include<queue> #i ...

  2. Vue绑定事件

    <!-- 方法处理器 --> <button v-on:click="doThis"></button> <!-- 内联语句 --> ...

  3. Spring 配置自动扫描原理说明

    Spring利用IOC容器将所有的bean进行有秩序的管理维护,而实际项目中不可能在xml文件中创建bean,而是利用了Spring的组件自动扫描机制,通过在classpath自动扫描的方式把组件纳入 ...

  4. 带你底层看Sqoop如何转换成MapReduce作业运行的(代码程序)

    补充 其实啊,我们知道,sqoop在运行的时候,最终会去转换成mapreduce作业,这个很简单,不多赘述.直接贴出来. 具体这些怎么运行的,见我如下这篇博客.这里只做一个引子. Sqoop Impo ...

  5. 实现CSS样式垂直水平完全居中

    1.水平居中 a.内联元素(inline or inline-*)居中? 你可以让他相对父级块级元素居中对齐 .center-children { text-align: center; } b.块级 ...

  6. 用css让元素隐藏的几种办法

    display:none;   //能隐藏并不占空间 visibility:hidden;  //隐藏但占据空间 opacity:0; position:absolute 移动到不在页面显示的地方

  7. 洛谷 P1850 换教室

    P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq ...

  8. 例说linux内核与应用数据通信(四):映射设备内核空间到用户态

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途]         一个进程的内存映象由以下几部分组成:代码段.数据段.BSS段和 ...

  9. ACM 中JAVA的应用

    原文地址:http://www.cppblog.com/vontroy/archive/2010/05/24/116233.html 先说一下Java对于ACM的一些优点吧: (1) 对于熟悉C/C+ ...

  10. MFC只允许程序单开

    很多玩游戏的人都知道一般游戏客户端程序是不允许双开的,就是说在同一游戏在启动的时候,是无法打开多个窗口.很多其他软件如酷狗播放器等也是这样.如果把打开的窗口最小化,这时重新启动程序,最小化的窗口会被显 ...