点我看题目

题意 :建一堵墙粘贴海报,每个候选人只能贴一张海报,海报的高度与墙一样高,一张海报的宽度是整数个单位,墙被划分为若干个部分,每个部分的宽度为一个单位,每张海报完全的覆盖一段连续的墙体,墙体的宽度占整数个单位。因为候选人将海报贴到墙上的时候可能会将别人的覆盖或覆盖一部分,给出海报的大小,选举墙上张贴的位置,和张贴的次序,然后问你最后还能看到几张海报。

思路 : 这个墙因为有10000000单位长,而n最大有10000,所以要先进行离散化,但是离散化之前要先将数字存起来,排序之后再将每相邻的两个数之间一个数加入离散的数组,离散化的处理 :先将n张海报的左边界,右边界中间位置存储在数组x里,然后递增排序x,剔除其中重复的坐标,可以当成染色问题,就是贴上一张海报就将这张海报染上颜色。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <algorithm> const int maxn = ; bool vis[maxn] ;//颜色i被使用的标志是vis[i]
int l[maxn],r[maxn],num[maxn*],tree[maxn*],x[maxn*] ;
//不大于左边界的不同坐标数为l[i],不大于右边界的不用坐标数为r[i],左边界的坐标为x[3*i-2],右边界的坐标
//为x[3*i-1],中间坐标为x[3*i]。x数组排序后在x[1...j]中不重复的坐标数为num[i].
int c,n ;
//线段树中结点k标记为tree[k],即代表区间的颜色码 using namespace std ; int binarysearch(int sum)//计算坐标区间[0...sum]中不同的坐标数
{
int l = , r = *n ;
while(r >= l)
{
int mid = (l+r) >> ;
if(x[mid] <= sum)
l = mid+ ;
else r = mid-;
}
return num[r] ;
} void update(int i)
{
if(!tree[i]) return ;
tree[i*] = tree[i*+] = tree[i] ;
tree[i] = ;
} void change(int tl,int tr,int l,int r,int i,int co)
{
if(tr < l || tl > r) return ;
if(tl <= l && r <= tr)
{
tree[i] = co ;
return ;
}
update(i) ;
int mid = (l+r) >> ;
change(tl,tr,l,mid,i*,co) ;
change(tl,tr,mid+,r,i*+,co) ;
} int require(int l ,int r,int i)
{
int mid = (l+r) >> ;
if(tree[i])
{
if(!vis[tree[i]])//在节点i已标记的情况下,若当前颜色未先涂过,则置该颜色使用标志并返回1,否则返回0,以防重复标记
{
vis[tree[i]] = ;
return ;
}
return ;
}
if(l == r) return ;
return require(l,mid,i*)+require(mid+,r,i+i+) ;
} void Init()//离散化处理海报信息
{
scanf("%d",&n) ;
for(int i = ; i <= n ;i++)
{
scanf("%d %d",&l[i],&r[i]) ;//读入每张海报的左右边界。
x[i*-] = l[i] ; x[i*-] = r[i] ;x[i*] = (l[i]+r[i])>> ;
}
sort(x+,x+*n+) ;
memset(num,,sizeof(num)) ;
for(int i = ; i <= *n ; i++)
{
num[i] = num[i-] ;
if(x[i] != x[i-]) num[i]++ ;
}
for(int i = ; i <= n ; i++)
{
l[i] = binarysearch(l[i]) ;
r[i] = binarysearch(r[i]) ;
}
} void solve()
{
memset(tree,,sizeof(tree)) ;//线段树中每个结点代表的区间未涂色
for(int i = ; i <= n ;i++)
change(l[i],r[i],,*n,,i) ;
memset(vis,false,sizeof(vis)) ;
printf("%d\n",require(,*n,) );
}
int main()
{
scanf("%d",&c) ;
for(int i = ; i <= c ; i++)
{
Init() ;
solve() ;
}
return ;
}

POJ 2528 Mayor's posters(线段树)的更多相关文章

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

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

  2. poj 2528 Mayor's posters 线段树+离散化技巧

    poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...

  3. poj 2528 Mayor's posters 线段树区间更新

    Mayor's posters Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=2528 Descript ...

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

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

  5. poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化

    Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...

  6. POJ 2528 Mayor's posters (线段树)

    题目链接:http://poj.org/problem?id=2528 题目大意:有一个很上的面板, 往上面贴海报, 问最后最多有多少个海报没有被完全覆盖 解题思路:将贴海报倒着想, 对于每一张海报只 ...

  7. poj 2528 Mayor's posters(线段树)

    题目:http://poj.org/problem?id=2528 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...

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

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

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

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

  10. POJ 2528 Mayor’s posters (线段树段替换 && 离散化)

    题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000).求出最后还能看见多少张海报. 分析 ...

随机推荐

  1. ERROR 1114 (HY000): The table 'adv_date_tmp' is full(Mysql临时表应用)

    场景:需要对现在数据库的数据进行批量的进行is_del=1的操作,但是遇到一个问题,在执行sql的时候发现sql不能在查询特定表的时候再嵌套查询来做update的操作,经过讨论,后续我们想到用临时表的 ...

  2. 一个项目覆盖CS所有课程的可行性探究

    我们先看计算机科学有哪些子领域. 学术领域有: 计算理论 信息和编码理论 算法和数据结构 形式化方法 程序设计语言 实践领域有: 计算机体系结构 并行计算和分布式系统 实时系统和嵌入式系统 操作系统 ...

  3. selendroid项目实战教程1

    selendroid是国内使用非常少的框架.资料也少.刚好公司项目用到,给大家分享下,技术不太行,有错误还望指正. 使用selendroid契机,是公司开发的APP,需要大量捕捉Toast信息.公司的 ...

  4. .Net程序员快速学习安卓开发-布局和点击事件的写法

    关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 本系列课程 致力于老手程序员可以快速入门学习安卓开发.系统全面的从一个.Net程序员的角度一步步学习总结安 ...

  5. jquery处理textarea中的手动换行

    textarea的手动换行会产生换行标志,但这个标志存在却看不到,存入数据库中后读出来显示在页面上却不会换行,如何处理呢? 网上众说纷纭,经过测试用 textarea的内容.replace(/\n/g ...

  6. nyoj349 poj1094 Sorting It All Out(拓扑排序)

    nyoj349   http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094   http://poj.org/problem?id=10 ...

  7. js生成动态日历

    效果图:   看代码: <html> <head> <title>动态日历</title> <style type="text/css& ...

  8. JamCam创业故事:辞掉工作,去开发一个应用

    编者按:这是JamCam创始人的自述.这家初创公司提供的应用很简单,但是极为成功:有了JamCam,你所录制的视频会自动添加你正在iPhone中聆听的音乐,作为视频的背景音乐.和朋友分享时是不是方便多 ...

  9. 第14章高级IO总结

    1 低速系统调用 可能使进程永远阻塞的一类系统调用,包括: 1)读某些文件类型(管道.终端.网络设备)的数据 2)写某些文件类型(管道.终端.网络设备),但数据不能被立即接受(管道中无空间.流量控制等 ...

  10. 九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)

    题目地址:http://ac.jobdu.com/problem.php?pid=1455 题目描述: 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元, ...