hihoCoder #1079 离散化

P1 : 离散化

Time Limit:10000ms

Case Time Limit:1000ms

Memory Limit:256MB

描述

小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~

这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住。看到这个场景,小Hi便产生了这样的一个疑问——最后到底能有几张海报还能被看见呢?

于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作长度为L的一段区间,且有N张海报按照顺序依次贴在了宣传栏上,其中第i张海报贴住的范围可以用一段区间[a_i, b_i]表示,其中a_i, b_i均为属于[0, L]的整数,而一张海报能被看到当且仅当存在长度大于0的一部分没有被后来贴的海报所遮挡住。那么问题就来了:究竟有几张海报能被看到呢?

提示一:正确的认识信息量

提示二:小Hi大讲堂之线段树的节点意义

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第1行为两个整数N和L,分别表示总共贴上的海报数量和宣传栏的宽度。

每组测试数据的第2-N+1行,按照贴上去的先后顺序,每行描述一张海报,其中第i+1行为两个整数a_i, b_i,表示第i张海报所贴的区间为[a_i, b_i]。

对于100%的数据,满足N<=10^5,L<=10^9,0<=a_i<b_i<=L。

输出

对于每组测试数据,输出一个整数Ans,表示总共有多少张海报能被看到。

Sample Input
5 10
4 10
0 2
1 6
5 9
3 4
Sample Output
5

解题:线段树。。。离散化

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <climits>
 7 #include <vector>
 8 #include <queue>
 9 #include <cstdlib>
10 #include <string>
11 #include <set>
12 #include <stack>
13 #define LL long long
14 #define pii pair<int,int>
15 #define INF 0x3f3f3f3f
16 using namespace std;
17 const int maxn = 100100;
18 struct node{
19     int lt,rt,cover;
20 };
21 node tree[maxn<<2];
22 void build(int lt,int rt,int v){
23     tree[v].lt = lt;
24     tree[v].rt = rt;
25     tree[v].cover = 0;
26     if(lt + 1 == rt) return;
27     int mid = (lt + rt)>>1;
28     build(lt,mid,v<<1);
29     build(mid,rt,v<<1|1);
30 }
31 void update(int lt,int rt,int p,int v){
32     if(tree[v].lt >= lt && tree[v].rt <= rt){
33         tree[v].cover = p;
34         return;
35     }
36     if(tree[v].cover){
37         tree[v<<1].cover = tree[v<<1|1].cover = tree[v].cover;
38         tree[v].cover = 0;
39     }
40     if(lt < tree[v<<1].rt) update(lt,rt,p,v<<1);
41     if(rt > tree[v<<1|1].lt) update(lt,rt,p,v<<1|1);
42 }
43 set<int>s;
44 void query(int v){
45     if(tree[v].cover){
46         s.insert(tree[v].cover);
47         return;
48     }
49     if(tree[v].lt + 1 == tree[v].rt) return;
50     query(v<<1);
51     query(v<<1|1);
52 }
53 int lisan[maxn<<2],n,L,x[maxn],y[maxn],tot,cnt;
54 int main() {
55     while(~scanf("%d %d",&n,&L)){
56         tot = cnt = 0;
57         for(int i = 1; i <= n; ++i){
58             scanf("%d %d",x+i,y+i);
59             lisan[tot++] = x[i];
60             lisan[tot++] = y[i];
61         }
62         sort(lisan,lisan+tot);
63         for(int i = 1; i < tot; ++i)
64             if(lisan[cnt] != lisan[i])
65                 lisan[++cnt] = lisan[i];
66         build(0,cnt,1);
67         s.clear();
68         for(int i = 1; i <= n; ++i){
69             int a = lower_bound(lisan,lisan+cnt+1,x[i])-lisan;
70             int b = lower_bound(lisan,lisan+cnt+1,y[i])-lisan;
71             if(a == b) continue;
72             update(a,b,i,1);
73         }
74         query(1);
75         printf("%d\n",s.size());
76     }
77     return 0;
78 }

时间: 2024-08-07 00:00:37

hihoCoder #1079 离散化的相关文章

hihoCoder - 1079 - 离散化 (线段树 + 离散化)

#1079 : 离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住.看到这个场景,小Hi便产生了这样的一个疑问--最后到底能有几张海报还能被看见呢? 于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作

hihocoder #1079 : 离散化-线段树应用

#1079 : 离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住.看到这个场景,小Hi便产生了这样的一个疑问——最后到底能有几张海报还能被看见呢? 于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作

hihoCoder #1079 : 离散化 (线段树,数据离散化)

题意:有一块宣传栏,高一定,给出长度,再给出多张海报的张贴位置,问还能见到几张海报(哪怕有一点被看到)?假设海报的高于宣传栏同高. 思路:问题转成“给出x轴上长为L的一条线段,再用n条线段进行覆盖上去,最后还能看到及条线”.长度是0~L,即长度是L,进行离散化的时候,应该用1~L,每个数字表示一个单位长.还有就是按照提示所给的信息实现即可.步骤如下: (1)保存n个数据,做成pair,并将所有出现过的数字在另外找地方排序,去掉重复的,再将数据紧缩化处理,那么大小在1~max.再将紧缩化的数据与原

hihoCoder#1079(线段树+坐标离散化)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住.看到这个场景,小Hi便产生了这样的一个疑问——最后到底能有几张海报还能被看见呢? 于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作长度为L的一段区间,且有

hiho1079 : 离散化(线段树+区间离散化)

#1079 : 离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住.看到这个场景,小Hi便产生了这样的一个疑问--最后到底能有几张海报还能被看见呢? 于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作

hihoCoder:#1079(线段树+离散化)

题目大意:给n个区间,有的区间可能覆盖掉其他区间,问没有完全被其他区间覆盖的区间有几个?区间依次给出,如果有两个区间完全一样,则视为后面的覆盖前面的. 题目分析:区间可能很长,所以要将其离散化.但离散化之后区间就变成了连续的,不再是离散的.也就是叶子由左右端点为u.u变成了左右端点为u-1.u,左右儿子有(l,mid)和(mid+1,r)变成了(l,mid)和(mid,r).所以离散化之后要以长度为1的区间为叶子节点建立线段树,而不是以1.2.3...为叶子节点建线段树. 代码如下: # inc

HihoCoder 1590 : 紧张的会议室(区间最大+离散化)

时间限制:20000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi的公司最近员工增长迅速,同时大大小小的会议也越来越多:导致公司内的M间会议室非常紧张. 现在小Hi知道公司目前有N个会议,其中第i个会议的时间区间是(Si, Ei). 注意这里时间区间可以视为是开区间,也就是说(3, 5)和(5, 6)不会被视为是同时进行的会议. 小Hi想知道如果他新增一个会议,时间区间是(X, Y),会不会导致出现会议室不够用的情况? 已知目前的N个会议不会导致会议室不够用. 输入 第一行包含

hicocoder1079离散化+线段树

题目链接:http://hihocoder.com/problemset/problem/1079 题目大意: 有一条数轴,先后对数轴上的一些区间着上不同的颜色,后着色的区间若跟先着色的区间有重合,则重合部分颜色将被后着色的区间颜色覆盖,求在一系列的区间着色操作之后,最终数轴上的颜色有几种.区间数目n<=10^5, 区间长度最大值L<=10^9. 这道题目乍看上去就是一道简单的线段树区间更新区间查询的问题,但仔细一看发现,区间长度最大值L可能达到10^9,若按照普通的线段树来做,内存根本开不下

hihoCoder 1383 : The Book List 北京网络赛

http://hihocoder.com/problemset/problem/1383?sid=950389 #1383 : The Book List 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The history of Peking University Library is as long as the history of Peking University. It was build in 1898. At the end of year 2015