The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally decided to build an electoral wall for placing the posters 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 first line of input contains a number c giving the number of cases that follow. The first line of data for a single case contains number 1 <= n <= 10000. The subsequent n lines describe the posters in the order in which they were placed. The i-th line among the n lines contains two integer numbers l i 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 <= l i <= ri <= 10000000. After the i-th poster is placed, it entirely covers all wall segments numbered l i, l i+1 ,... , ri.

Output

For each input data set print the number of visible posters after all the posters are placed.

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

最开始觉得和zoj1610 count colors应该是一个模板

但是交了以后发现MLE

数据范围太大 没办法直接用数组 所以要离散化

第一次用到离散化 学了个新内容 代码是借鉴了题解

eg 范围[1,6] [1.7] [2,10] [8 18] 将各点排序
1 1 2 6 7 8 10 18   离散后对应的坐标为
 1  2 3 4 5 6  7    再根据原来的点把它们对应起来,则离散后坐标为
[1,3] [1,4] [2,6] [5,7]

离散化代码

for(int i = 0; i < n * 2; i += 2){
//int a, b;
scanf("%d%d",&post[i].x,&post[i + 1].x);
post[i].id = post[i + 1].id = i;
}
sort(post, post + 2 * n, cmp1);
int tot = 0, pre = 0;
for(int i = 0; i < 2 * n; i++){
if(post[i].x == pre)
post[i].x = tot;
else{
pre = post[i].x;
post[i].x = ++tot;
}
}

从后往前贴 能保证已经能看见的poster里总能有最后的一部分不会被遮住

如果发现这段区域已经被完全覆盖了就返回

完整代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<limits>
#include<stack>
#include<queue>
#include<cmath>
#define inf 1000005
//Ïß¶ÎÊ÷DÌâ
//http://blog.csdn.net/dt2131/article/details/52919953
//http://www.cnblogs.com/jackge/archive/2013/04/25/3041637.html
using namespace std; const int maxn = 100010;
int c, n,flag;
//int tree[maxn << 2], dis[maxn];
bool vis[maxn];
struct node{
int id, x;
}post[maxn << 2];
struct Tree{
int l, r;
bool vis;
}tree[maxn << 2]; void build(int L, int R, int rt)
{
tree[rt].l = L;
tree[rt].r = R;
tree[rt].vis = 0;
if(tree[rt].l == tree[rt].r)
return;
int mid = (L + R) / 2;
build(L, mid, rt * 2);
build(mid + 1, R, rt * 2 + 1);
} void pushup(int rt)
{
tree[rt].vis = tree[2 * rt].vis && tree[2 * rt + 1].vis;
} /*void pushdown(int rt)
{
if(tree[rt] != -1){
tree[2 * rt] = tree[2 * rt + 1] = tree[rt];
tree[rt] = -1;
}
} void update(int a, int b, int data, int l, int r, int rt)
{
if(a <= l && b >= r){
tree[rt] = data;
return;
}
if(tree[rt] == data)
return;
pushdown(rt);
int mid = (l + r) / 2;
if(a <= mid)
update(a, b, data, l, mid, 2 * rt);
if(b > mid)
update(a, b, data, mid + 1, r, 2 * rt + 1);
}*/ /*void query(int l, int r, int rt)
{
if(tree[rt] != -1){
for(int i = l; i <= r; i++){
dis[i] = tree[rt];
}
return;
}
if(l != r && tree[rt] == -1){
int mid = (l + r) / 2;
query(l, mid, 2 * rt);
query(mid + 1, r, 2 * rt + 1);
}
}
*/
void query(int L, int R, int rt)
{
if(tree[rt].vis)
return;
if(tree[rt].l == L && tree[rt].r == R)
{
tree[rt].vis = 1;
flag = 1;
return;
}
int mid = (tree[rt].l + tree[rt].r) / 2;
if(R <= mid)
query(L, R, 2 * rt);
else if(L >= mid + 1)
query(L, R, 2 * rt + 1);
else{
query(L, mid, 2 * rt);
query(mid + 1, R, 2 * rt + 1);
}
pushup(rt);
} bool cmp1(node a, node b)
{
return a.x < b.x;
} bool cmp2(node a, node b)
{
if(a.id == b.id)
return a.x < b.x;
return a.id > b.id;
} int main()
{
scanf("%d",&c);
while(c--){
scanf("%d",&n);
//memset(tree, -1, sizeof(tree));
//memset(dis, -1, sizeof(dis));
//int k = 1;
for(int i = 0; i < n * 2; i += 2){
//int a, b;
scanf("%d%d",&post[i].x,&post[i + 1].x);
post[i].id = post[i + 1].id = i;
}
sort(post, post + 2 * n, cmp1);
int tot = 0, pre = 0;
for(int i = 0; i < 2 * n; i++){
if(post[i].x == pre)
post[i].x = tot;
else{
pre = post[i].x;
post[i].x = ++tot;
}
}
build(1, 2 * n, 1);
sort(post, post + 2 * n, cmp2);
int ans = 0;
for(int i = 0; i < 2 * n; i += 2){
int l = post[i].x;
int r = post[i + 1].x;
flag = 0;
query(l, r, 1);
if(flag)
ans++;
}
/*memset(vis, 0, sizeof(vis)); int res = 0;
for(int i = 0; i < maxn;){
while(i < maxn && dis[i] == -1)
i++;
if(i >= maxn)
break;
int temp = dis[i];
if(!vis[temp]){
vis[temp] = true;
res++;
}
//res[temp]++;
while(i < maxn && dis[i] == temp)
i++;
} /*int ans = 0;
for(int i = 0; i < maxn; i++){
ans += res[i];
}*/
printf("%d\n",ans);
}
return 0;
}

poj2528 Mayor's posters【线段树】的更多相关文章

  1. poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 43507   Accepted: 12693 ...

  2. POJ2528 Mayor's posters —— 线段树染色 + 离散化

    题目链接:https://vjudge.net/problem/POJ-2528 The citizens of Bytetown, AB, could not stand that the cand ...

  3. [poj2528] Mayor's posters (线段树+离散化)

    线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...

  4. poj2528 Mayor's posters(线段树之成段更新)

    Mayor's posters Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 37346Accepted: 10864 Descr ...

  5. POJ2528:Mayor's posters(线段树区间更新+离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  6. poj2528 Mayor's posters(线段树区间修改+特殊离散化)

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  7. poj2528 Mayor's posters(线段树区间覆盖)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 50888   Accepted: 14737 ...

  8. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

  9. Mayor's posters(线段树+离散化POJ2528)

    Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 51175 Accepted: 14820 Des ...

  10. POJ 2528 Mayor's posters(线段树+离散化)

    Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...

随机推荐

  1. html实体转换

    摘要: 在 HTML 中,某些字符是预留的.在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签.如果希望正确地显示预留字符,我们必须在 HTML 源代码中 ...

  2. tooltips插件

    摘要: 继‘带箭头提示框’,本文将分享几款带箭头提示框. qtipqTip是一种先进的提示插件,基于jQuery框架.以用户友好,而且功能丰富,qTip为您提供不一般的功能,如圆角和语音气泡提示,并且 ...

  3. MS Chart Control 學習手記(二) - 圓餅圖

    using System.Web.UI.DataVisualization.Charting; 02 using System.Drawing; 03   04 namespace Chart.AJA ...

  4. org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'parentId' in 'class java.lang.String'

    Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ' ...

  5. Linux+Redis实战教程_day02_Linux系统上安装MySQL

    Linux系统上安装MySQL 安装MySQL 卸载自带mysql 查询mysql的安装情况,可以直接使用了 rpm -qa | grep -i mysql –-color 卸载原生的MySQL rp ...

  6. Spring @Scheduled定时任务动态修改cron参数

    在定时任务类上增加@EnableScheduling注解,并实现SchedulingConfigurer接口.(注意低版本无效) 设置一个静态变量cron,用于存放任务执行周期参数. 另辟一线程,用于 ...

  7. JSONP 劫持漏洞实例

    0x01 Jsonp简介 Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据. 为什么我们从 ...

  8. Bypass 护卫神SQL注入防御(多姿势)

    0x00 前言 ​ 护卫神一直专注服务器安全领域, 其中有一款产品,护卫神·入侵防护系统 ,提供了一些网站安全防护的功能,在IIS加固模块中有一个SQL防注入功能. 这边主要分享一下几种思路,Bypa ...

  9. linux 下 java 链接oracle数据库

    import java.sql.*; public class Hello { private final String oracleDriverName = "oracle.jdbc.dr ...

  10. iOS 事件的产生、传递、响应

    一.事件的产生和传递 1.1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中为什么是队列而不是栈?因为队列的特定是先进先出,先产生的事件先处理才符合常 ...