[swustoj 764] 校门外的树 Plus Plus
校门外的树 Plus Plus(0764)
问题描述
西南某科技大学的校门外长度为 L 的公路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 1 的位置,另一端在 L 的位置;数轴上的每个整数点,即 1,2,……,L,都种有一棵树。
现在要将这排树的某一段涂成某种颜色,给定 N 组区间[ J,K ],表示从 J 到 K 的树都要涂上一种颜色(每次涂的颜色不一样,而且每次涂色会覆盖掉原来的颜色),区间之间可能有重叠的部分, L 的长度为 1000,0000。现在你的任务是计算涂色工作结束后,这一排树里总共有多少种颜色的树?(没涂过色的不算)
输入
第一行为一个整数N (1<=N<=10000)。 接下来的N行每行是两个整数数J,K(1<=J<=K<=1000,0000),表示涂色的起止区间。
多组测试数据。
输出
一个整数,表示有多少种颜色的树。
样例输入
2
1 10
5 5
1
1 1
样例输出
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 40005 struct tree
{
int l,r;
}p[N<<]; int tot;
int ans;
int x[N];
int lazy[N<<];
bool flag[N<<]; void pushdown(int rt)
{
if(lazy[rt]!=-)
{
lazy[rt<<]=lazy[rt<<|]=lazy[rt];
lazy[rt]=-;
}
}
void build(int l,int r,int rt)
{
lazy[rt]=-;
if(l==r) return;
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
}
void update(int l,int r,int rt,int L,int R,int c)
{
if(l==L && R==r)
{
lazy[rt]=c;
return;
}
pushdown(rt);
int m=(l+r)>>;
if(R<=m) update(l,m,rt<<,L,R,c);
else if(L>m) update(m+,r,rt<<|,L,R,c);
else
{
update(l,m,rt<<,L,m,c);
update(m+,r,rt<<|,m+,R,c);
}
}
void query(int l,int r,int rt)
{
if(lazy[rt]!=-)
{
if(!flag[lazy[rt]])
{
ans++;
flag[lazy[rt]]=;
}
return;
}
if(l>=r) return;
pushdown(rt);
int m=(l+r)>>;
query(l,m,rt<<);
query(m+,r,rt<<|);
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
ans=;
tot=;
memset(flag,,sizeof(flag));
for(i=;i<n;i++)
{
scanf("%d%d",&p[i].l,&p[i].r);
x[tot++]=p[i].l;
x[tot++]=p[i].r;
} sort(x,x+tot);
tot=unique(x,x+tot)-x;
for(i=tot-;i>;i--)
{
if(x[i]-x[i-]>) x[tot++]=x[i-]+;
}
sort(x,x+tot);
build(,tot-,);
for(i=;i<n;i++)
{
int l=lower_bound(x,x+tot,p[i].l)-x;
int r=lower_bound(x,x+tot,p[i].r)-x;
update(,tot-,,l,r,i);
}
query(,tot-,);
cout<<ans<<endl;
}
return ;
}
原来搓代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 20005 struct tree
{
int l,r;
}p[N<<];
struct node
{
int val,id,pos;
}h[N<<]; int ans;
int color[N<<];
bool flag[N<<];
int change[N<<]; bool cmp(node a,node b)
{
return a.val<b.val;
}
void pushup(int rt)
{
color[rt]=;
}
void pushdown(int rt)
{
if(change[rt]!=-)
{
change[rt<<]=change[rt<<|]=change[rt];
color[rt<<]=color[rt<<|]=change[rt];
change[rt]=-;
}
}
void build(int l,int r,int rt)
{
color[rt]=;
change[rt]=-;//初始化
if(l==r) return;
int m=(l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
}
void update(int l,int r,int rt,int L,int R,int c)
{
if(l==L && R==r)
{
color[rt]=c;
change[rt]=c;
return;
}
pushdown(rt);
int m=(l+r)>>;
if(R<=m)
update(l,m,rt<<,L,R,c);
else if(L>m)
update(m+,r,rt<<|,L,R,c);
else
{
update(l,m,rt<<,L,m,c);
update(m+,r,rt<<|,m+,R,c);
}
pushup(rt);
}
void query(int l,int r,int rt)
{
int m=(l+r)>>;
if(color[rt])
{
if(!flag[color[rt]])
{
ans++;
flag[color[rt]]=;
}
return;
}
if(l==r) return; //忘了加这一句、一直RE
query(l,m,rt<<);
query(m+,r,rt<<|);
}
int main()
{
int n,i;
while(scanf("%d",&n)!=EOF)
{
ans=;
memset(flag,,sizeof(flag));
for(i=;i<n;i++)
{
scanf("%d%d",&p[i].l,&p[i].r);
h[i*].val=p[i].l;
h[i*].id=i;
h[i*].pos=;
h[i*+].val=p[i].r;
h[i*+].id=i;
h[i*+].pos=;
}
/* 离散化 */
sort(h,h+n*,cmp);
int last=-,total=;
for(i=;i<n*;i++)
{
if(h[i].val!=last)
{
total++;
if(i && h[i].val-h[i-].val>) total++; //注意这里、= =、手动插点
last=h[i].val;
}
if(h[i].val!=total)
{
if(h[i].pos) p[h[i].id].r=total;
else p[h[i].id].l=total;
}
}
build(,total,);
for(i=;i<n;i++)
{
update(,total,,p[i].l,p[i].r,i+);
}
query(,total,);
cout<<ans<<endl;
}
return ;
}
[swustoj 764] 校门外的树 Plus Plus的更多相关文章
- P1047 校门外的树
P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...
- Vijos1448校门外的树 题解
Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...
- OpenJudge计算概论-校门外的树
/*======================================================================== 校门外的树 总时间限制: 1000ms 内存限制: ...
- 校门外的树 - Grids2808
校门外的树 问题描述: 某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是1 米.我们 可以把马路看成一个数轴,马路的一端在数轴0 的位置,另一端在L 的位置:数轴上的每 个整数点, ...
- 校门外的树 OpenJudge 1.6.06
06:校门外的树 总时间限制: 1000ms 内存限制: 65536kB 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0 ...
- 【解题报告】VijosP1448校门外的树(困难版)
原题: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r ...
- Vijos P1103 校门外的树【线段树,模拟】
校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...
- Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】
校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...
- C语言 · 校门外的树
算法提高 校门外的树 时间限制:1.0s 内存限制:256.0MB 问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的 ...
随机推荐
- (转)MySQL Workbench的使用教程 (初级入门版)
转自:http://www.cnblogs.com/yqskj/archive/2013/03/01/2938027.html MySQL Workbench 是 MySQL AB 最近释放的可视数据 ...
- 程序员面试题精选100题(38)-输出1到最大的N位数[算法]
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:输入数字n,按顺序输出从1最大的n位10进制数.比如输入3,则输出1.2.3一直到最大的3位数即999. 分析:这 ...
- php 调用 webservice服务
class data{ $a = 123; $b = 456; } //直接php的SoapClient类 $client = new SoapClient('http://xxx.com/xx.as ...
- 在Mac OS X中使用VIM开发STM32(2)
本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重! 在我先前的博文⎣在Mac OS X中使用VIM开发STM32(1)⎤中,我们安装完成了MACVIM,这一 ...
- 利用javascript Location访问Url,重定向,刷新页面
网上转来了, 方便以后查询参考 本文介绍怎么使用javascript Location对象读和修改Url.怎么重载或刷新页面.javascript提供了许多方法访问,修改当前用户在浏览器中访问的url ...
- CentOS7 IP自动获取
/etc/sysconfig/network-scripts HWADDR=00:15:5D:00:76:04TYPE=EthernetBOOTPROTO=dhcpDEFROUTE=yesPEERDN ...
- php判断手机浏览还是web浏览,并执行相应的动作
正好需要,在网上找了好久,记录一下 function isMobile(){ $useragent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTT ...
- 使用.htaccess进行浏览器图片文件缓存
对于图片类网站,每次打开页面都要重新下载图片,慢不说,还非常浪费流量.这时就需要用到缓存,强制浏览器缓存图片文件 缓存文件,提问网站访问数度,减少流量消耗,现提供2中缓存代码 打开.htaccess文 ...
- JavaScript自定义方法实现trim()、Ltrim()、Rtrim()
去除字符串两端的空格,是字符串处理非常常用的方法如何trim() .Ltrim() .Rtrim(),可惜的是javascript中无此方法,下面有个不错的自定义教程感兴趣的朋友可以参考下 去除字符串 ...
- java 调用oracle 分页存储过程 返回游标数据集
1.分页类 package org.zh.basic; /** * 页面类 * * @author keven * */ public class PageInfo { // 定义 private S ...