Vijos P1103 校门外的树【线段树,模拟】
时间:2022-05-07
本文章向大家介绍Vijos P1103 校门外的树【线段树,模拟】,主要内容包括校门外的树、描述、格式、输出格式、样例1、样例输出1、限制、来源、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
校门外的树
描述
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。 已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
格式
输入格式
输入的第一行有两个整数:L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出格式
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
样例1
样例输入1
500 3
150 300
100 200
470 471
样例输出1
298
限制
每个测试点1s
来源
NOIP2005普及组第二题
思路:我估计也是智障了,这题明显可以用模拟做,我TM竟然用线段树写,还RE了两发,数组开了四倍你还要我怎样,结果我开了八倍过了QAQ!
下面给出线段树写法:
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N=20010;
4 int n,m,ans=1;
5 struct Node
6 {
7 int l,r,sum;
8 }tree[N<<2];
9 inline void buildtree(int l,int r,int pos)
10 {
11 tree[pos].l=l;
12 tree[pos].r=r;
13 if(l==r)
14 {
15 tree[pos].sum=1;
16 return;
17 }
18 int mid=(tree[pos].l+tree[pos].r)/2;
19 buildtree(l,mid,pos*2);
20 buildtree(mid+1,r,pos*2+1);
21 tree[pos].sum=tree[pos*2].sum+tree[pos*2+1].sum;
22 }
23 inline int query(int l,int r,int pos)
24 {
25 if(tree[pos].l==l&&tree[pos].r==r)
26 return tree[pos].sum;
27 if(tree[pos].r<l||tree[pos].l>r)
28 return 0;
29 return query(l,r,pos*2)+query(l,r,pos*2+1);
30 }
31 inline void update(int l,int r,int pos)
32 {
33 if(tree[pos].l==l&&tree[pos].r==r)
34 {
35 tree[pos].sum=0;
36 return;
37 }
38 if(tree[pos].l>r||tree[pos].r<l)
39 return;
40 update(l,r,pos*2);
41 update(l,r,pos*2+1);
42 tree[pos].sum=tree[pos*2].sum+tree[pos*2+1].sum;
43 }
44 int main()
45 {
46 cin>>n>>m;
47 buildtree(1,n,1);
48 for(int i=1;i<=m;i++)
49 {
50 int l,r;
51 scanf("%d%d",&l,&r);
52 if(!l)
53 ans=0;
54 update(!l?1:l,r,1);
55 }
56 cout<<query(1,n,1)+ans<<endl;
57 return 0;
58 }
模拟做法:简单解释一下,做法就是在【0,r】我们全部赋值为1,然后for一遍删去重复部分,非常简单,智障的我开始没想到,但是如果这题L的数据是1000000,线段树依然是正解!QAQ
下面给出模拟的代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N=10010;
4 int a[N];
5 int main()
6 {
7 int n,m;
8 cin>>n>>m;
9 for(int i=0;i<=n;i++)
10 a[i]=1;
11 for(int i=1;i<=m;i++)
12 {
13 int l,r;
14 cin>>l>>r;
15 for(int j=l;j<=r;j++)
16 {
17 a[j]=0;
18 }
19 }
20 int sum=0;
21 for(int i=0;i<=n;i++)
22 {
23 if(a[i])
24 sum++;
25 }
26 cout<<sum<<endl;
27 return 0;
28 }
- 一则备库CPU报警的思考(r7笔记第69天)
- Java设计模式-观察者模式
- 今天处理的三个小问题——20160120(r7笔记第84天)
- 主备切换的准备工作(r7笔记第83天)
- Java设计模式-外观模式
- Java设计模式-组合模式
- 使用shell批量监控磁盘坏块(二) (r7笔记第80天)
- JavaWeb10-request&response你不得不学(1)
- dg的奇怪问题终结和分区问题答疑 (r7笔记第77天)
- 最近让我焦灼的四个问题(有解) (r7笔记第76天)
- JavaWeb10-reques;response你不得不学(2)
- 很多人比较纠结的约束和索引的关系(r7笔记第75天)
- JavaWeb09-Servlet(Java真正的全栈开发)
- JavaWeb08-XML,tomcat,HTTP轻松入门
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AJAX的post请求与上传文件
- memcached的一些简单使用
- nosql介绍,memrcached介绍,安装memcached,查看memcachedq状态
- 如何在IDEA2017创建Maven的Web工程
- JSP上传文件与导出Excel表
- 关于CentOS中tomcat的8005端口启动不起来的解决办法
- 安装ansible以及简单使用
- 设计模式之职责链
- 转录组分析 | 使用SAMtools将SAM文件转换为BAM文件、排序、建立索引
- Matlab系列之那些数学函数(讨论功能已加入)
- 简单使用saltstack
- CentOS7下搭建postfix邮箱服务器并实现extmail的web访问
- 安装saltstack
- 简单使用jumpserver
- 简单实现MVC模式