时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:5791

解决:2649

题目描述:

有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。

    现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。

    可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。

输入:

两个整数L(1<=L<=10000)和M(1<=M<=100)。

    接下来有M组整数,每组有一对数字。

输出:

可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。

样例输入:
500 3
100 200
150 300
470 471
样例输出:
298
来源:
2011年清华大学计算机研究生机试真题

思路:

我写代码1的时候还不知道线段树的概念,用了一种比较笨的方法,每次对区间内所有数赋值操作。这个题时间复杂度要求不高,能通过。

后来学了一下线段树,用线段树实现的,见代码2。很奇怪的是线段树的时间复杂度并没有显著改善

代码1:

#include <stdio.h>
#include <string.h> #define N 10000 int main(void)
{
int L, M;
int moved[N+1];
int i, j;
int begin, end; while (scanf("%d%d", &L, &M) != EOF)
{
memset(moved, 0, (N+1)*sizeof(int));
for (i=0; i<M; i++)
{
scanf("%d%d", &begin, &end);
for (j=begin; j<=end; j++)
moved[j] = 1;
}
int count = 0;
for (j=0; j<=L; j++)
count += moved[j];
printf("%d\n", L+1-count);
} return 0;
}
/**************************************************************
Problem: 1088
User: liangrx06
Language: C
Result: Accepted
Time:50 ms
Memory:912 kb
****************************************************************/

代码2:

#include <stdio.h>
#include <limits.h> #define N 10001 int seg[4*N]; void pushdown(int i)
{
if (seg[i] != -1)
{
seg[2*i] = seg[i];
seg[2*i+1] = seg[i];
seg[i] = -1;
}
} void update(int k, int i, int b, int e, int l, int r)
{
if (b > r || e < l)
return;
if (l <= b && e <= r)
{
seg[i] = k;
return;
}
pushdown(i);
update(k, 2*i, b, (b+e)/2, l, r);
update(k, 2*i+1, (b+e)/2+1, e, l, r);
} int getsum(int i, int b, int e)
{
if (seg[i] == -1)
return getsum(2*i, b, (b+e)/2) + getsum(2*i+1, (b+e)/2+1, e);
if (seg[i] == 1)
return e-b+1;
else
return 0;
} int main(void)
{
int n, i, m;
int l, r; while (scanf("%d%d", &n, &m) != EOF)
{
for (i=0; i<4*N; i++)
seg[i] = -1;
update(1, 1, 0, n, 0, n); for (i=0; i<m; i++)
{
scanf("%d%d", &l, &r);
update(0, 1, 0, n, l, r);
}
printf("%d\n", getsum(1, 0, n));
} return 0;
}
/**************************************************************
Problem: 1088
User: liangrx06
Language: C
Result: Accepted
Time:40 ms
Memory:1068 kb
****************************************************************/

九度OJ 1088:剩下的树 (线段树)的更多相关文章

  1. 【九度OJ】题目1201-二叉排序树

    题目 建树过程是递归,"递归的思路不是很复杂",经过题目1078的训练,直接开始编码.提交及修改的过程告诉自己,这是一个错觉,对递归的理解还应该再进一步. 自己的实现 #inclu ...

  2. 九度OJ 1172:哈夫曼树 (贪心)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6701 解决:2954 题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数.需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结 ...

  3. 九度OJ 1090:路径打印 (树、DFS)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1704 解决:314 题目描述: 给你一串路径,譬如: a\b\c a\d\e b\cst d\ 你把这些路径中蕴含的目录结构给画出来,子目 ...

  4. 【九度OJ】题目1176:树查找 解题报告

    [九度OJ]题目1176:树查找 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1176 题目描述: 有一棵树,输出某一深度的所有节点 ...

  5. 【九度OJ】题目1172:哈夫曼树 解题报告

    [九度OJ]题目1172:哈夫曼树 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1172 题目描述: 哈夫曼树,第一行输入一个数n, ...

  6. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  7. 【九度OJ】题目1107:搬水果 解题报告

    [九度OJ]题目1107:搬水果 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1107 题目描述: 在一个果园里,小明已经将所有的水 ...

  8. 【九度OJ】题目1185:特殊排序 解题报告

    [九度OJ]题目1185:特殊排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1185 题目描述: 输入一系 ...

  9. 【九度OJ】题目1438:最小公倍数 解题报告

    [九度OJ]题目1438:最小公倍数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1438 题目描述: 给定两个正整数,计 ...

随机推荐

  1. 如何在requirejs下引用bootstrap

    原本以为只要require过来就能用 require(['jquery','underscore','bootstrap','cache'],function($,U,B,C){ 但发现会报错,类似未 ...

  2. 标准C程序设计七---32

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  3. getID3类的学习使用

    getID3类的学习使用 网上描述: getID3()这个PHP脚本能够从MP3或其它媒体文件中提取有用的信息如:ID3标签,bitrate,播放时间等. (格式包括:Ogg,WMA,WMV,ASF, ...

  4. postgresql 10 分页

    示例: select * from test limit 2 offset 2; limit:指查多少条数据 offset:从下标多少开始查,下标从0开始,不能为负数. offset计算公式: var ...

  5. POJ 3171 区间覆盖最小值&&线段树优化dp

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4715   Accepted: 1590 D ...

  6. JDK1.8日期时间库学习

    这周在阅读<阿里巴巴Java开发手册>时,在并发处理一节的日期处理中,其强调SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果 定义为 stati ...

  7. BZOJ 1355 [Baltic2009] Bazinga

    题面 [题目描述] 对于给定的n个字符串S1,S2--,Sn,标号为1到n,请你找出一个最大的i使得标号小于i的字符串中存在一个不是i的子串. [输入描述]: 第一行包括一个整数t(1<=t&l ...

  8. C#深入学习:泛型修饰符in,out、逆变委托类型和协变委托类型

    在C#中,存在两个泛型修饰符:in和out,他们分别对应逆变委托和协变委托. 我们知道,在C#中要想将一个泛型对象转换为另一个泛型对象时,必须要将一个泛型对象拆箱,对元素进行显式或隐式转换后重新装箱. ...

  9. 简约至上.md

    中秋花了一天多时间阅读了简约至上这本书,书中内容不多,主要是向我们传达了产品设计的4个要素,给了产品经理设计产品时的一些要义指导; 一产品定位 在进行产品设计之前,首页需要对这款产品的商业定位需要有个 ...

  10. android 根据图片名字获取图片id

    public int getResource(String imageName){ Context ctx=getBaseContext(); int resId = getResources().g ...