poj 2528 Mayor's posters 【线段树 + 离散化】
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 50643 | Accepted: 14675 |
Description
and introduce the following rules:
- Every candidate can place exactly one poster on the wall.
- All posters are of the same height equal to the height of the wall; the width of a poster can be any integer number of bytes (byte is the unit of length in Bytetown).
- The wall is divided into segments and the width of each segment is one byte.
- Each poster must completely cover a contiguous number of wall segments.
They have built a wall 10000000 bytes long (such that there is enough place for all candidates). When the electoral campaign was restarted, the candidates were placing their posters on the wall and their posters differed widely in width. Moreover, the candidates
started placing their posters on wall segments already occupied by other posters. Everyone in Bytetown was curious whose posters will be visible (entirely or in part) on the last day before elections.
Your task is to find the number of visible posters when all the posters are placed given the information about posters' size, their place and order of placement on the electoral wall.
Input
the n lines contains two integer numbers li and ri which are the number of the wall segment occupied by the left end and the right end of the i-th poster, respectively. We know that for each 1 <= i <= n, 1 <= li <= ri <= 10000000. After
the i-th poster is placed, it entirely covers all wall segments numbered li, li+1 ,... , ri.
Output
The picture below illustrates the case of the sample input.

Sample Input
1
5
1 4
2 6
8 10
3 4
7 10
Sample Output
4
题意:一个城市要竞选市长。竞选者能够在一块墙上贴海报为自己拉票,每一个人能够贴连续的一块区域。后来贴的能够覆盖前面的,问到最后一共能够看到多少张海报。
第一道离散化:(滚动数组优化) ORZ网上的大牛
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 10000+100
using namespace std;
struct Node
{
int x, y;
};
Node num[10100];
int color[MAXN<<4];
int rec[MAXN<<4];//离散化 存储
int Find(int val, int *a, int L, int R)//在a数组下标[L, R]范围里面 查找val值的下标
{
int left = L, right = R;
while(left <= right)
{
int mid = (left + right) >> 1;
if(a[mid] == val)
return mid;
if(a[mid] < val)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
void PushDown(int o)
{
if(color[o])
{
color[o<<1] = color[o<<1|1] = color[o];
color[o] = 0;
}
}
void update(int o, int l, int r, int L, int R, int v)
{
if(L <= l && R >= r)
{
color[o] = v;
return ;
}
PushDown(o);
int mid = (l + r) >> 1;
if(L <= mid)
update(o<<1, l, mid, L, R, v);
if(R > mid)
update(o<<1|1, mid+1, r, L, R, v);
}
int vis[10100];//标记该海报是否出现过
int ans;//纪录数目
void query(int o, int l, int r)
{
if(color[o])
{
if(!vis[color[o]])
ans++,vis[color[o]] = true;
return ;
}
//return ;
if(l == r)
return ;
int mid = (l + r) >> 1;
query(o<<1, l, mid);
query(o<<1|1, mid+1, r);
}
int main()
{
int t, N;
scanf("%d", &t);
while(t--)
{
scanf("%d", &N);
memset(color, 0, sizeof(color));
int len = 1;
for(int i = 1; i <= N; i++)
{
scanf("%d%d", &num[i].x, &num[i].y);
rec[len++] = num[i].x;
rec[len++] = num[i].y;
}
sort(rec+1, rec+len);
//离散化
int RR = 2;
for(int i = 2; i < len; i++)//滚动数组优化
{
if(rec[i] != rec[i-1])
rec[RR++] = rec[i];
}
for(int i = RR-1; i > 1; i--)
{
if(rec[i] != rec[i-1] + 1)
rec[RR++] = rec[i-1] + 1;
}
sort(rec+1, rec+RR);//不是RR+1
for(int i = 1; i <= N; i++)
{
int l = Find(num[i].x, rec, 1, RR-1);
int r = Find(num[i].y, rec, 1, RR-1);
update(1, 1, RR-1, l, r, i);
}
memset(vis, false, sizeof(vis));
ans = 0;
query(1, 1, RR-1);
printf("%d\n", ans);
}
return 0;
}
poj 2528 Mayor's posters 【线段树 + 离散化】的更多相关文章
- POJ 2528 Mayor's posters 离散化+线段树
题目大意:给出一些海报和贴在墙上的区间.问这些海报依照顺序贴完之后,最后能后看到多少种海报. 思路:区间的范围太大,然而最多仅仅会有10000张海报,所以要离散化. 之后用线段树随便搞搞就能过. 关键 ...
- POJ 2528 Mayor's posters 离散化和线段树题解
本题就是要往墙上贴海报,问最后有多少可见的海报. 事实上本题的难点并非线段树,而是离散化. 由于数据非常大,直接按原始数据计算那么就会爆内存和时间的. 故此须要把数据离散化. 比方有海报1 6 7 ...
- poj 2528 Mayor's posters
这个题意是市长竞选,然后每一个人都能够贴广告牌.能够覆盖别人的看最后剩几个广告牌 这题目想了两个多小时,最后忍不住看了一下题解. 发现仅仅是简单地hash 和线段树成段更新 由于有10000个人竞选 ...
- 线段树区间更新,区间统计+离散化 POJ 2528 Mayor's posters
题意:有一个非常长的板子(10000000长),在上面贴n(n<=10000)张海报.问最后从外面能看到几张不同的海报. 由于板子有10000000长,直接建树肯定会爆,所以须要离散化处理,对于 ...
- POJ训练计划2528_Mayor's posters(线段树/成段更新+离散化)
解题报告 id=2528">地址传送门 题意: 一些海报,覆盖上去后还能看到几张. 思路: 第一道离散化的题. 离散化的意思就是区间压缩然后映射. 给你这么几个区间[1,300000] ...
- poj 2528 Mayor's posters 线段树+离散化技巧
poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- Mayor's posters (线段树+离散化)
Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...
- [poj2528] Mayor's posters (线段树+离散化)
线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...
随机推荐
- Spring MVC简介 2.5 Spring MVC执行的流程
package org.fkit.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http ...
- [转载]RouteOS安装设置
原文地址:RouteOS安装设置作者:抟鹏追梦 RouteOS2.7.4可以将一台普通的PC机变成一台专业的路由器,高到ISP的核心路器/认证网关-因为它功能强大稳定,低到家庭网关防火墙-因为它免费. ...
- ansible upload
# 链接地址:https://www.cnblogs.com/xiaoxiaoleo/p/6626299.html # synchronize: 从拉取远程服务器文件,需要加mode: pull # ...
- winFrom线程
方法--->委托--->BeginInvoke用指定的参数异步执行委托 委托就是我想做什么,而你可以作什么,我就让你去做.
- meta标签的作用及整理
[转载] meta的标签的使用是我在前端学习中曾经困惑过一段时间的问题.一方面不是很了解meta标签的用途,另一方面是对于meta标签里的属性和值不是懂,也不知道从哪里冒出来的,所以这篇文章专门整理下 ...
- Git Learning Part III - working remotely (Github)
help document of Github : https://help.github.com/ 1 upload 1.1 new update Initialize a repository ...
- javascript中in用法介绍
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- React+Antd遇到的坑
第一次尝试React+antd,发现果然不愧是传说中的坑货,一个又一个坑.必须要记录. react + antd,都是最新版本,使用npm和yarn各种add,build,start 1. 资源文件, ...
- Java中 对象的创建于调用
Main方法是程序的主入口,想要用某个方法必须在main方法中调用 创建对象: 类名 对象名 = new 类名(); 使用对象访问类中的成员: 对象名.成员变量: 对象名.成员方法(); 成员变量的默 ...
- BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机_栈
Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...