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 ...
随机推荐
- day05_03 字符串格式化
pycharm小技巧,一般情况下都需要在代码前注释以下作者以及创建日期 但是如何让软件默认生成呢? 格式化输出 可以用占位符 %s string的缩写 #__author:Administra ...
- day03_02 Python版本的选择
总结:python2.x是遗产(过时),python3.x是现在和未来的语言 In summary : Python 2.x is legacy, Python 3.x is the present ...
- 数组快速生成range的方法
//生成[item1-item9]数组 Array(9).join(0).split('').map((item,index) => 'item' + (index+1)) //生成20个对象的 ...
- VCO的配置方法
弄了个VCO的环境. 感觉有点儿麻烦,配乱七八糟的服务,弄完了SE也不试试,白弄了.最近又有人说这东西要试试. 我先简单记录下吧: 1. 在vCenter Server 下开启SSO,设置密码. 2. ...
- java面试之String源码中equals具体实现
废话不多说,直接看代码,注释已经写在上面了: public boolean equals(Object anObject) { if (this == anObject) {//比较两个对象的地址 r ...
- es6总结(十二)--generator
- phthon入门介绍
1.基本的python语法 2.python爬虫 3.基本的数据分析 4.做网站 5.做机器学习 1.python简介: Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于 ...
- Django ConnectionAbortedError WinError 10053 错误
因为ajax默认是异步提交,可是有时候我们会发现,本来要求请求马上出现,可是异步会导致后面突然再执行,这样就出问题了. (1)添加这样一段代码 $.ajaxSetup({ async : false ...
- LeetCode OJ——Unique Binary Search Trees
class Solution { public: int numTrees(int n) { ); vector<int> numVector; numVector.assign(n+,) ...
- AC日记——城市 洛谷 P1401
题目描述 N(2<=n<=200)个城市,M(1<=m<=40000)条无向边,你要找T(1<=T<=200)条从城市1到城市N的路,使得最长的边的长度最小,边不能 ...