[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米.我们可以把马路看成一个数轴,马路的 ...
随机推荐
- 11_Servlet的一些细节知识点
[Servlet的细节知识点1-----一个Servlet映射到多个URL] 同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servl ...
- Codevs 1684 垃圾陷阱
1684 垃圾陷阱 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了 ...
- [leetcode] 401. Binary Watch
https://leetcode.com/contest/5/problems/binary-watch/ 这个题应该是这次最水的,这个题目就是二进制,然后是10位,最大1024,然后遍历,找二进制里 ...
- 08_rlCoachKin自主编译,调试
为了知道参数的意思,以及为了从头建立一个项目,我从使用QTCreator来单独建立项目(当然也可以直接使用源代码中建立好的VS项目). 其实也推荐 VS2010调试 如果是用自带的VS项目,那么我们需 ...
- C++ IO 详细用法
http://www.cnblogs.com/keam37/ keam所有 转载请注明出处 本文将分别从<iostream>,<sstream>,<fstream> ...
- Eclipse配置CAS client
1.新建一个Maven项目 2.Next,选择 3.输入group id 和 artifact id --> Finish 4.项目创建完成的目录结构 编辑pom.xml文件,写上依赖 注意把 ...
- mysql---索引及explain的作用
索引:是一种数据结构,以增加存储开销和减慢DML(增.删.改)操作来提高查询速度. 常见的索引结构:btree索引(myisam,innodb,memory,heap),hash索引(memory,h ...
- C#基础(六)——值类型与引用类型
CLR支持两种类型:值类型和引用类型. 值类型包括C#的基本类型(用关键字int.char.float等来声明),结构(用struct关键字声明的类型),枚举(用enum关键字声明的类型):而引用类型 ...
- 重学C语言 -- printf,scanf
printf(); 用来显示格式串的内容 注意: 参数不可以换行,否则会出一个警告. 格式串中占位符比表达式数量多 会显示一个无意义值 格式串中占位符比表 ...
- An error occurred while collecting items to be installed session context was:(profile=DefaultProfile... 解决方案
遇到同样问题的小伙伴请:点击Eclipse上方工具栏中help --> Install new software... --> 看图 点击进红框的位置在打开的窗口中,将窗口右侧的Avail ...