POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
- 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
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
题目大意:在一块儿宣传栏中贴宣传单,规定宽度相同,长度不同。按一定顺序贴,给出宣传单的起始和结束位置,这里位置不能忽略成点(而是一段长度),问最后会看到几个宣传单。
解题思路:由于给出的数据范围多大,所以要先进行离散化减少复杂度,因为这里给出的不是”点“是带长度的,所以一般的离散化会出现离散失真,这里可以在离散的时候增加技巧,即在不相邻的数据里增加分隔点,凸显不连续。然后进行线段树成段替换,最后求出整个区间的不同宣传单个数。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
const int maxn=50000;
int lm[maxn/2],rm[maxn/2];
int col[maxn*4];
int Hash[maxn];
int A[maxn];
int num=0;
int discretization(int l,int r,int key){ //离散化 while(l<=r){ int m=(l+r)/2;
if(key==A[m]){ return m;
}else if(key<A[m]){ r=m-1;
}else{ l=m+1;
}
}
}
void PushDown(int rt){ if(col[rt]!=-1){ col[rt*2]=col[rt];
col[rt*2+1]=col[rt];
col[rt]=-1;
}
}
void update(int rt,int L,int R,int l_ran,int r_ran,int _col){ if(l_ran<=L&&R<=r_ran){ col[rt]=_col;
return ;
}
PushDown(rt);
if(l_ran<=mid)
update(lson,l_ran,r_ran,_col);
if(r_ran>mid)
update(rson,l_ran,r_ran,_col);
}
void query(int rt,int L,int R){ if(col[rt]!=-1){ if(!Hash[col[rt]]){ num++;
Hash[col[rt]]=1;
}
return ;
}
if(L==R)
return ;
query(lson);
query(rson);
}
void debug(){ for(int i=1;i<32;i++){ printf("%d %d\n",i,col[i]);
}
}
int main(){ int t;
scanf("%d",&t);
while(t--){ int n,nn=0,m;
scanf("%d",&n);
for(int i=0;i<n;i++){ scanf("%d%d",&lm[i],&rm[i]);
A[nn++]=lm[i];
A[nn++]=rm[i];
}
sort(A,A+nn);
m=1;
for(int i=0;i<nn-1;i++){ //去重 if(A[i]!=A[i+1]){ A[m++]=A[i+1];
}
}
for(int i=m-1;i>0;i--){ //添加分隔点 if(A[i]!=A[i-1]+1){ A[m++]=A[i-1]+1;
}
}
sort(A,A+m);
int tml,tmr;
memset(col,-1,sizeof(col));
for(int i=0;i<n;i++){ tml= discretization(0,m-1,lm[i]); //离散化
tmr= discretization(0,m-1,rm[i]); //离散化
update(1,0,m-1,tml,tmr,i);
}
// debug();
memset(Hash,0,sizeof(Hash));
num=0;
query(1,0,m-1);
printf("%d\n",num);
}
return 0;
}
POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】的更多相关文章
- POJ 2528 Mayor’s posters (线段树段替换 && 离散化)
题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000).求出最后还能看见多少张海报. 分析 ...
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- poj 2528 Mayor's posters 线段树+离散化技巧
poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...
- poj 2528 Mayor's posters 线段树区间更新
Mayor's posters Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=2528 Descript ...
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
- POJ 2528 Mayor's posters(线段树,区间覆盖,单点查询)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45703 Accepted: 13239 ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化
Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...
- poj 2528 Mayor's posters(线段树)
题目:http://poj.org/problem?id=2528 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...
- POJ 2528 Mayor's posters (线段树)
题目链接:http://poj.org/problem?id=2528 题目大意:有一个很上的面板, 往上面贴海报, 问最后最多有多少个海报没有被完全覆盖 解题思路:将贴海报倒着想, 对于每一张海报只 ...
随机推荐
- 指针和动态分配内存 (不定长度数组)------新标准c++程序设计
背景: 数组的长度是定义好的,在整个程序中固定不变.c++不允许定义元素个数不确定的数组.例如: int n; int a[n]; //这种定义是不允许的 但是在实际编程中,往往会出现要处理的数据数量 ...
- 1222: FJ的字符串 [水题]
1222: FJ的字符串 [水题] 时间限制: 1 Sec 内存限制: 128 MB 提交: 92 解决: 20 统计 题目描述 FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = ...
- EF进阶篇(二)——CRUD
前言 不写前言了... 内容 我们都知道我们修改的实体状态添加到上下文里面,然后上下文根据实体状态生成相应的SQL执行脚本,去隐式执行到数据库中.(屏幕前的你暂且这样理解吧,因为小编语文没有学好,太通 ...
- Python编程笔记二进制、字符编码、数据类型
Python编程笔记二进制.字符编码.数据类型 一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存 ...
- Tensorflow博文列表
tensorflow:https://wenku.baidu.com/view/489ecc9727fff705cc1755270722192e44365853.html 语义分割SegNet:htt ...
- SLAM到底是什么?一文带你读懂SLAM
SLAM是Simultaneous localization and mapping缩写,意为“同步定位与建图”,主要用于解决机器人在未知环境运动时的定位与地图构建问题,为了让大家更多的了解SLAM, ...
- mysql数据库分库分表shardingjdbc
分库分表理解 分库分表应用于互联网的两个场景;大量数据和高并发,通常策略有两种:垂直分库,水平拆分 垂直拆分:是根据业务将一个库拆分为多个库,将一个表拆分为多个表,例如:将不常用的字段和经常访问的字段 ...
- CentOS 中安装tomcat
1.安装tomcat前,需要安装JDK 2.下载tomcat安装包 wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.31/bin ...
- Qt 学习之路 2(69):进程
Qt 学习之路 2(69):进程 豆子 2013年11月9日 Qt 学习之路 2 15条评论 进程是操作系统的基础之一.一个进程可以认为是一个正在执行的程序.我们可以把进程当做计算机运行时的一个基础单 ...
- flask-restful基础
flask-restful基本使用 基本使用 from flask_restful import Api,Resource,reqparse,inputs from flask import Flas ...