传送门:http://bailian.openjudge.cn/practice/2528?lang=en_US

//http://poj.org/problem?id=2528

题意:

给你n长海报,每张海报在墙上贴的区间范围是l,r

问你这n张海报贴完后,可以看见的海报数量是多少

题解:

离散化+线段树

因为l,r的数据范围是1e7,而题目只给了64MB的空间,直接存的话空间会炸掉,所以需用用到离散化的技巧

然后按照端点单点更新即可

现在重新写这题发现这个题坑点在于每一个点他都代表一个长度为1的东东,所以我们普通的离散话会出问题

1-10 1-4 5-10

1-10 1-4 6-10

譬如 如上这组例子

所以我们离散化时做一下优化, 如果相邻间数字间距大于1时我们就在其中加上任意一个数字

这样离散话下来后做线段树就可以过

这组数据

3

5 6

4 5

6 8

3

1 10

1 3

6 10

5

1 4

2 6

8 10

3 4

7 10

这组数据

答案是3,3,4

代码:

#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> pil;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define ls rt<<1
#define rs rt<<1|1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define bug printf("*********\n")
#define FIN freopen("input.txt","r",stdin);
#define FON freopen("output.txt","w+",stdout);
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"
#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n" const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 3e5 + 5;
const int INF = 0x3f3f3f3f;
const LL INFLL = 0x3f3f3f3f3f3f3f3;
struct node {
int l, r;
} q[maxn];
int col[maxn];
int vis[maxn];
int ans;
void push_down(int rt) {
if(col[rt] != -1) {
col[ls] = col[rs] = col[rt];
col[rt] = -1;
}
return;
}
void update(int L, int R, int c, int l, int r, int rt) {
if(L <= l && r <= R) {
col[rt] = c;
return;
}
push_down(rt);
int mid = (l + r) >> 1;
if(L <= mid) update(L, R, c, lson);
if(R > mid) update(L, R, c, rson);
}
void query(int l, int r, int rt) {
if(col[rt] != -1) {
if(!vis[col[rt]]) ans++;
vis[col[rt]] = true;
return;
}
if(l == r) return;
int mid = (l + r) >> 1;
query(lson);
query(rson);
}
int x[maxn];
int main() {
int T;
scanf("%d", &T);
while(T--) {
int cnt = 0;
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d%d", &q[i].l, &q[i].r);
x[cnt++] = q[i].l;
x[cnt++] = q[i].r;
}
sort(x, x + cnt);
int m = 1;
for(int i = 1; i < cnt; i++) {
if(x[i] != x[i - 1]) {
x[m++] = x[i];
}
}
for(int i = m - 1; i >= 1; i--) {
if(x[i] != x[i - 1] + 1) {
x[m++] = x[i - 1] + 1;
}
}
sort(x, x + m);
memset(col, -1, sizeof(col));
for(int i = 0; i < n; i++) {
int l = lower_bound(x, x + m, q[i].l) - x;
int r = lower_bound(x, x + m, q[i].r) - x;
update(l, r, i, 0, m, 1);
}
ans = 0;
memset(vis, false, sizeof(vis));query(0, m, 1);
printf("%d\n",ans ); }
}

poj/OpenJ_Bailian - 2528 离散化+线段树的更多相关文章

  1. D - Mayor's posters POJ - 2528 离散化+线段树 区间修改单点查询

    题意 贴海报 最后可以看到多少海报 思路 :离散化大区间  其中[1,4] [5,6]不能离散化成[1,2] [2,3]因为这样破坏了他们的非相邻关系 每次离散化区间 [x,y]时  把y+1点也加入 ...

  2. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

  3. 南阳理工 题目9:posters(离散化+线段树)

    posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 The citizens of Bytetown, AB, could not stand that ...

  4. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

  5. hpu校赛--雪人的高度(离散化线段树)

    1721: 感恩节KK专场——雪人的高度 时间限制: 1 Sec  内存限制: 128 MB 提交: 81  解决: 35 [提交][状态][讨论版] 题目描述 大雪过后,KK决定在春秋大道的某些区间 ...

  6. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  7. 【bzoj4636】蒟蒻的数列 离散化+线段树

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...

  8. 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers

    题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...

  9. Mayor's posters (离散化线段树+对lazy的理解)

    题目 题意: n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围 li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 思路: 由于 ...

随机推荐

  1. 四.使用JDBC进行批处理操作

    1 create table testbatch 2 ( 3 id int primary key, 4 name varchar(20) 5 ); 在实际的项目开发中,有时候需要向数据库发送一批SQ ...

  2. HDU_1005:Number Sequence

    Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...

  3. 阿里云发布 Redis 5.0 缓存服务:全新 Stream 数据类型带来不一样缓存体验

    4月24日,阿里云正式宣布推出全新 Redis 5.0 版本云数据库缓存服务,据悉该服务完全兼容 4.0 及早期版本,继承了其一贯的安全,稳定,高效等特点并带来了全新的 Stream 数据结构及多项优 ...

  4. C#面向对象基础--类与对象

    1.类与对象 类是面向对象编程的基本单元:类造出来的变量叫对象. 一个类包含俩种成员:字段与方法. 字段即变量,方法即函数. 面向对象思想:教给我们如何合理的运用类的规则去编写代码. 2.类的字段 字 ...

  5. jmeter日期处理beanshell(2)

    import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.text.P ...

  6. 威胁快报|挖矿团伙8220进化,rootkit挖矿趋势兴起

    近日,阿里云安全团队发现8220挖矿团伙为了更持久的驻留主机以获得最大收益,开始使用rootkit技术来进行自我隐藏.这类隐藏技术的使用在watchdogs等挖矿蠕虫使用后开始出现逐渐扩散和进化的趋势 ...

  7. @codeforces - 414E@ Mashmokh's Designed Problem

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵 n 个点的树,每个点的儿子是有序的. 现给定 m 次操 ...

  8. git 本地仓库操作

    一.git对象模型和存储 二.常用命令 1)git checkout branch 切换分支 假设现在有两个分支,master和dev分支 i dev分支上没有readme.txt 在master分支 ...

  9. js循环遍历数组(对象)

    1,for循环 对于循环应该是最常用的一种遍历方式了,通常用来遍历数组结构. let arr = [a,b,d];for (let i=0; i<arr.length; i++){ consol ...

  10. oracle总是使用索引的第一个列

    如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 译者按: 这也是一条简单而重要的规则. 见以下实例. SQL> ...