HDU 5372 线段树
给出两种操作:
第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 线段树的更多相关文章
- 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 ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1542 线段树扫描(面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- C#加减乘除
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 平板电脑上完美体验Windows 8 (视频)
平板电脑上完美体验Windows 8 (视频) 目前,计算机产业正面临重大变革,三网融合,云计算,物联网正加速终端产品的融合.4C融合成为终端产品的未来发展趋势,是4C融合的代表性产品,它破了传统的W ...
- 如何监控和解决SQL Server的阻塞(1) (当前阻塞)
1. 什么是"阻塞"? 阻塞是SQL数据库应用"锁"机制的一个副作用.当一个应用请求针对某个数据库对象(例如全表,某行数据, 或者是某个数据页)加锁后,那么这个 ...
- find---查找文件或目录
ind命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录和文件全部进行 ...
- SVN无法提交,路径找不到问题的解决方案
自己有了个云服务器,只在上面搭建了几个博客网站(小雷网等). 我自己的代码,保存在SVNChina上,每年99元.(私人的付费,开源的免费) 云服务器,闲着也是闲着,决定在上面搭建一个属于自己的SVN ...
- WPF转换器
1. 前文 在普遍的也业务系统中, 数据要驱动到操作的用户界面, 它实际储存的方式和表达方式会多种多样, 数据库存储的数字 0或1, 在界面用户看到显示只是 成功或失败, 或者存储的字符.或更多的格式 ...
- 利用zip格式实现手机客户端二维码扫描分享识别
场景: 用户A想要将某应用推荐给用户B,用户B扫描用户A的手机app中的二维码进行下载和安装, 并且需要识别用户B是扫描了用户A的二维码,进而给用户A一定的奖励. (例如:健一网app) zip格式: ...
- 1.22 Python基础知识 - 正则表达式
Python正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re ...
- vuex-store模块化配置
一.目录结构: src -> js -> modules 1. 在modules下新建文件夹,文件夹名称按模块功能命名 如: modules ---- home -> homeMod ...
- Linux启动(续)
runlevel (启动级别): 查看命令 :who -r 或 runlevel 0:halt 关机 1:单用户模式,直接以管理员身份登录,不需要密码 ...