校门外的树

描述

某校大门外长度为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普及组第二题

题目链接:https://vijos.org/p/1103

思路:我估计也是智障了,这题明显可以用模拟做,我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 }

Vijos P1103 校门外的树【线段树,模拟】相关推荐

  1. 树套树-线段树套平衡树

    作用 线段树的作用是区间修改和查询,平衡树的作用是查询第k大,k的排名,前驱,后继.这两个结合起来,就变成了可以区间修改和查询第k大,k的排名,前驱,后继的数据结构:树套树-线段树套平衡树. 实现 先 ...

  2. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的-- 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  3. vijos 1448 校门外的树 树状数组

    描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的-- 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l. ...

  4. 线段树线段树的创建线段树的查询单节点更新区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  5. loj 523 「LibreOJ β Round #3」绯色 IOI(悬念) 霍尔定理+基环树+线段树

    题目分析 神仙题(确信) 首先,j−aij-a _ ij−ai​和ai−ja _ i-jai​−j互为相反数,若其中最小值为bib _ ibi​,则一个为bib _ ibi​一个为m−bim-b _ ...

  6. 线段树 ---- 线段树维护线段相加+滑动变长窗口 2021牛客多校第7场 F xay loves trees

    题目大意: 给你两个大小相同的树但是形状不一定一样 叫你选出最大的子集,满足下面两个条件 在第一颗树上是一条链 在第二颗树上任意两个点都不是祖先关系 解题思路: 首先我们现在第二颗树上面把每个点的df ...

  7. BZOJ 3685: 普通van Emde Boas树( 线段树 )

    建颗权值线段树就行了...连离散化都不用... 没加读入优化就TLE, 加了就A掉了...而且还快了接近1/4.... ---------------------------------------- ...

  8. 2021CCPC(桂林) - Suffix Automaton(后缀树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,再给出 qqq 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置.如果有多个答案,输出起点最小的那个. 本题规定字符串大小 ...

  9. 牛客 - sequence(笛卡尔树+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a 和数列 b ,求 题目分析:不算难的题目,对于每个 a[ i ] 求一下贡献然后维护最大值就好,具体思路就是,先找出每个 a[ i ] 左 ...

最新文章

  1. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态
  2. 微软发布通用型AI框架Avatar Framework
  3. Java学习笔记24
  4. php找不到指定的模块,php中的dll“无法找到指定的模块”
  5. java使用htmlunit工具抓取js中加载的数据
  6. cocos2d-x学习笔记16:记录存储1:CCUserDefault
  7. js data日期初始化的5种方法
  8. IdentityServer4系列 | 客户端凭证模式
  9. Nginx实用教程(二):配置文件入门
  10. 如何使用SpingMvc实现省市县三级级联?
  11. 图解android开发在界面上显示图片
  12. 解构淘宝SPM/SCM流量跟踪体系
  13. [迁移] Luac的使用
  14. 关于icon小图标的实现
  15. java 情感分析_Flink基于Alink中文情感分析示例(Java版本)
  16. JAVA萌新学习day17.18天 数据库MySQL
  17. Base64系列第一篇 Base64介绍
  18. 【嵌入式Linux开发一路清障-连载03】Ubuntu22.04使用Mount加载硬盘或NAS等硬盘
  19. FME对CAD扩展属性的读写
  20. 智能优化与机器学习结合算法实现时序数据预测matlab代码清单

热门文章

  1. 电脑日常故障及处理(二)
  2. 我在51CTO微职位学软考——网络工程师
  3. [100]第三波常用命令
  4. 如何查看经过iOS优化的PNG图片
  5. Web 探索之旅 | 第二部分第一课:客户端语言
  6. AndroidMainifest标签说明2——lt;activitygt;
  7. pull to load more data
  8. Convert Sorted Array to Binary Search Tree
  9. 整理find命令输出格式
  10. Forefront_TMG_2010-TMG建立Remote ***