COGS 265 线段覆盖
265. 线段覆盖
★★☆ 输入文件:xdfg.in 输出文件:xdfg.out 简单对比
时间限制:2 s 内存限制:20 MB
【问题描述】
有一根长度为 L 的白色条状物。有两种操作:
- 用一条长度为 T 的黑布盖住条状物的 [a, a+T] 这个区间 (0<=a, T<=L) 。
- 把某条黑布拿走。
输入 L 和 n 次操作,要你输出每次操作之后:
- 条状物上有多少个黑区间。
- 条状物上黑区间的总长度。
【输入格式】
输入文件第一行两个整数L(1<=L<=200000), n(1<=n<=200000)
以下有n行,第2--n+1行每行有3个整数m,a,T,m表示操作类型,1表示放入黑布,2表示拿走黑布,a,T表示黑布在L上的起始位置与长度,拿走的黑布保证是原来已经存在的.
【输出格式】
输出有n行,每行两个整数x,y,x表示L上的黑区间个数,y表示黑区间的总长度.
【输入输出样例】
输入:
20 4
1 5 3
1 7 2
2 5 3
1 16 3
输出:
1 3
1 4
1 2
2 5
题解:
线段树的区间覆盖,因为这个题没有查询操作,所以可以不用pushdown。然后就是updata和insert操作了。updata中要判断tag的值,然后进行更新(是清成全黑,或者根据孩子更新);add中对于找到的区间要看是否为单元素的,若为单元素的则直接更新,否则要判断tag的范围来进行。
AC代码:
#include<cstdio>
using namespace std;
#define N 200010
#define lc k<<1
#define rc k<<1|1
#define mid (l+r>>1)
struct node{
int l,r,sum,len;
bool flag;
}q[N<<];
int n,m,tag[N<<];
inline int read(){
register int x=,f=;
register char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void updata(int k,int l,int r){
if(tag[k]>){
q[k].l=q[k].r=q[k].sum=;q[k].len=r-l+;
}
else{
q[k].l=q[lc].l;q[k].r=q[rc].r;
q[k].sum=q[lc].sum+q[rc].sum;
if(q[lc].r==q[rc].l&&q[lc].r==) q[k].sum--;
q[k].len=q[lc].len+q[rc].len;
}
return ;
}
void add(int k,int l,int r,int x,int y,int v){
if(x<=l&&r<=y){
tag[k]+=v;
if(l==r) q[k].l=q[k].r=q[k].sum=q[k].len=tag[k]>?:;
else updata(k,l,r);
return ;
}
if(y<=mid) add(lc,l,mid,x,y,v);
else if(x>mid) add(rc,mid+,r,x,y,v);
else add(lc,l,mid,x,mid,v),add(rc,mid+,r,mid+,y,v);
updata(k,l,r);
}
int main(){
freopen("xdfg.in","r",stdin);
freopen("xdfg.out","w",stdout);
n=read();m=read();
for(int i=,x,y,z;i<=m;i++){
z=read();x=read();y=read();
if(z==)
add(,,n,x,x+y-,);
else
add(,,n,x,x+y-,-);
printf("%d %d\n",q[].sum,q[].len);
}
return ;
}
COGS 265 线段覆盖的更多相关文章
- COGS 265线段覆盖[线段树]
265. 线段覆盖 ★★☆ 输入文件:xdfg.in 输出文件:xdfg.out 简单对比时间限制:2 s 内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操 ...
- CODEVS3037 线段覆盖 5[序列DP 二分]
3037 线段覆盖 5 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 数轴上有n条线段,线段的 ...
- CODEVS1643 线段覆盖3[贪心]
1643 线段覆盖 3 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在一个数轴上有n条线段,现要选 ...
- CodeVS 线段覆盖1~5
#include <bits/stdc++.h> using namespace std; ; struct Info{int l,r;}P[Maxn]; int n,Cnt,F[Maxn ...
- 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)
3589: 动态树 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 405 Solved: 137[Submit][Status][Discuss] ...
- codevs 3012 线段覆盖 4 & 3037 线段覆盖 5
3037 线段覆盖 5 时间限制: 3 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 数轴上有n条线段,线段的两端都 ...
- wikioi 3027 线段覆盖 2
题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段 ...
- wikioi 1214 线段覆盖
题目描述 Description 给定x轴上的N(0<N<100)条线段,每个线段由它的二个端点a_I和b_I确定,I=1,2,--N.这些坐标都是区间(-999,999)的整数.有些线段 ...
- POJ 3347 Kadj Squares (线段覆盖)
题目大意:给你几个正方形的边长,正方一个顶点在x轴上然后边与x轴的夹角为45度,每个正方形都是紧贴的,问从上面看能看的正方形的编号 题目思路:线段覆盖,边长乘上2防止产生小数,求出每个正方形与x轴平行 ...
随机推荐
- CodeForces 455A Boredom (DP)
Boredom 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/G Description Alex doesn't like b ...
- HDU 5521 Meeting (最短路,dijstra)
题意:有N个点,两个人,其中一个人住在点1,另一个人住在点n,有M个点集,集合内的数表示任意两点的距离为dis ,现在问,如果两个人要见面, 需要最短距离是多少,有哪几个点能被当成见面点. 析:分别对 ...
- Java日期处理类
1.Date java.util.Date 2.Calendar 日历类,通过getInstance()获取实例对象,可以获取年月日时分秒 3.SimpleDateFormat 日期格式化,forma ...
- hibernate和mybatis
本来是个菜鸟程序员,现在大学还没毕业. 最近一直在想一个问题,到底是hibernate好还是mybatis好.我总觉得 hibernate好用之极,在大学里做过的小项目都是用的hibernate,只要 ...
- 创建类模式(三):创建者(Builder)
定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.这使得构件算法和组装方式可以独立应对变化:复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式 ...
- 如何将std::string转int,double? (C/C++) (C) (template)
http://www.cnblogs.com/oomusou/archive/2008/08/01/525647.html http://blog.sina.com.cn/s/blog_a843a88 ...
- 使用gcc编译gdb调试
gcc 在linux系统中,默认是没有安装gcc编译器的,可以通过命令 rpm -q | grep gcc 来查看.安装命令为: yum -y install gcc 安装后,编写一个.c结尾的文件. ...
- 解决Java版CKFinder无法显示缩略图问题
这些天在写我的Java EE项目的时候用到了CKEditor和CKFinder,但是在用CKFinder的时候无法显示图片的缩略图,但是官网上的demo上却有缩略图,我一直以为是自己配置错误了,我把官 ...
- 80端口被NT kernel & System 占用pid 4
前段时间停止了Apache,结果在打开的时候发现无法打开,80端口被占用,于是win+r 运行cmd 输入netstat -ano 可以看到80端口被PID4占用,于是打开任务管理器-进程-查看,选择 ...
- 美国VPS推荐1GB 50GB可以win
今天向大家推荐一款vps,1GB内存 50G硬盘 8M带宽 不限制流量,并且可以安装windows,年付才290元. 购买链接:http://www.jinbaoidc.com/page.aspx?c ...