poj 2528(区间改动+离散化)
题意:有一个黑板上贴海报。给出每一个海报在黑板上的覆盖区间为l r,问最后多少个海报是可见的。
题解:由于l r取值到1e7,肯定是要离散化的,但普通的离散化会出问题。比方[1,10],[1,4],[6,10]普通得到答案是2,但事实上是3。改进的离散化方法假设两个数字相差大于1,就在中间补一个数字。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 10005;
int n, l[N], r[N], a[N << 3], tree[N << 4], vis[N], res;
void pushdown(int k) {
if (tree[k] != -1) {
tree[k * 2] = tree[k * 2 + 1] = tree[k];
tree[k] = -1;
}
}
void modify(int k, int left, int right, int l1, int r1, int x) {
if (l1 <= left && right <= r1) {
tree[k] = x;
return;
}
pushdown(k);
int mid = (left + right) / 2;
if (mid >= l1)
modify(k * 2, left, mid, l1, r1, x);
if (mid < r1)
modify(k * 2 + 1, mid + 1, right, l1, r1, x);
}
void query(int k, int left, int right) {
if (left == right) {
if (!vis[tree[k]]) {
res++;
vis[tree[k]] = 1;
}
return;
}
pushdown(k);
int mid = (left + right) / 2;
query(k * 2, left, mid);
query(k * 2 + 1, mid + 1, right);
}
int main() {
int t;
scanf ("%d", &t);
while (t--) {
memset(tree, -1, sizeof(tree));
memset(vis, 0, sizeof(vis));
int cnt = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf ("%d%d", &l[i], &r[i]);
a[++cnt] = l[i];
a[++cnt] = r[i];
}
sort(a + 1, a + 1 + cnt);
cnt = unique(a + 1, a + 1 + cnt) - (a + 1);
int cnt2 = cnt;
for (int i = 2; i <= cnt; i++)
if (a[i] - a[i - 1] > 1)
a[++cnt2] = a[i] - 1;
cnt = cnt2;
sort(a + 1, a + 1 + cnt);
for (int i = 1; i <= n; i++) {
int l1 = lower_bound(a + 1, a + 1 + cnt, l[i]) - a;
int r1 = lower_bound(a + 1, a + 1 + cnt, r[i]) - a;
modify(1, 1, cnt, l1, r1, i);
}
res = 0;
query(1, 1, cnt);
printf("%d\n", res);
}
return 0;
}
poj 2528(区间改动+离散化)的更多相关文章
- POJ 2528 区间染色,求染色数目,离散化
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 47905 Accepted: 13903 ...
- POJ - 2528 区间离散化,线段树区间修改,区间询问
这个题非常有意思的地方是,我们发现区间[1,4]和[5,8]是紧挨着的,因为这个的数代表的是一段区间,原本我们对于普通的离散, a[1]=1,a[2]=5,a[3]=6,a[4]=8;数组下标就是重新 ...
- poj 2528(线段树+离散化) 市长的海报
http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...
- POJ 2528 (线段树 离散化) Mayor's posters
离散化其实就是把所有端点放在一起,然后排序去个重就好了. 比如说去重以后的端点个数为m,那这m个点就构成m-1个小区间.然后给这m-1个小区间编号1~m-1,再用线段树来做就行了. 具体思路是,从最后 ...
- poj 2528 线段树 离散化的小技巧
题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:直接搞超时+超内存,需要离散化.离散化简单的来说就是只取我们需要的值来 用,比如说区间[1000,2000],[1990,2012] ...
- Mayor's posters POJ - 2528(线段树 + 离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 74745 Accepted: 21574 ...
- zoj 3299(区间改动+离散化)
题意:有n个由小木块组成的长条木块要掉下来.给出木块的左右区间,然后有给了m个木板的左右区间和高度用来接住木块,由于木块是由小木块接触组成的,也就是木板能够接住一部分的木块.剩下的会继续掉落,问最后每 ...
- poj 2528 线段树+离散化
题意:在墙上贴一堆海报(只看横坐标,可以抽象成一线段),新海报可以覆盖旧海报.求最后能看到多少张海报 sol:线段树成段更新.铺第i张海报的时候更新sg[i].x~sg[i].y这一段为i. 然而坐标 ...
- hiho1079 线段树区间改动离散化
题目链接: hihocoder1079 代码: #include<iostream> #include<cstdio> #include<cstring> #inc ...
随机推荐
- Ajax、Comet、Websocket、SSE
从 http 协议说起 1996年IETF HTTP工作组发布了HTTP协议的1.0版本 ,到现在普遍使用的版本1.1,HTTP协议经历了17 年的发展.这种分布式.无状态.基于TCP的请求/响应式 ...
- hdu6085[压位+暴力] 2017多校5
/*hdu6085[压位+暴力] 2017多校5*/ /*强行优化..*/ #include <bits/stdc++.h> using namespace std; struct bit ...
- hdu6078[优化递推过程] 2017多校4
这道题一眼看过去好像和最长公共子序列有点像. 一开始只想到暴力的推法, 令dp[i][j][k]表示 a[i]=b[j](即以ai,bj为结尾的波浪序列的方案数), 且最终状态为k(0,1分别代表下降 ...
- 【bzoj3698】XWW的难题 有上下界最大流
题目描述 XWW是个影响力很大的人,他有很多的追随者.这些追随者都想要加入XWW教成为XWW的教徒.但是这并不容易,需要通过XWW的考核.XWW给你出了这么一个难题:XWW给你一个N*N的正实数矩阵A ...
- Java NIO系列教程(三-十二) Buffer
原文链接 作者:Jakob Jenkov 译者:airu 校对:丁一 Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到 ...
- zoj 3790 Consecutive Blocks 离散化+二分
There are N (1 ≤ N ≤ 105) colored blocks (numbered 1 to N from left to right) which are lined up in ...
- grunt 入门 应用grunt对代码进行压缩
1.什么是grunt grunt的官方解释是:javascript世界的构建工具. 为何要构建工具? 一句话:自动化.对于需要反复重复的任务,例如压缩(minification).编译.单元测试.li ...
- yii框架缓存知识总结(转载)
缓存是用于提升网站性能的一种即简单又有效的途径.稍微有点规模的网站都会通过存储相对静态的数据至缓存以备所需,这样我们可以省去从数据库查询然后生成这些数据的时间,通过减轻数据库的压力从而提升网站的性能. ...
- POJ 2577: Interpreter
简略解题报告 Description A certain computer has 10 registers and 1000 words of RAM. Each register or RAM l ...
- LeetCode OJ--Binary Tree Postorder Traversal
http://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 树的后序遍历,可以使用递归,也可以使用栈,下面是栈的实现代码 #inc ...