点我看题目

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

思路 : 这个墙因为有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. 如何使用axis2 构建 Android 服务器后端--- 工具准备与环境配置

    最近一个项目要做个android端的实验室器材管理系统.小伙伴英勇地接下android端的锅,我就 负责给他写后端,最近看到axis2 这个webservice挺好用的,折腾了几天给大家分享下: 1. ...

  2. Magento入门开发教程

    Modules->模块 Controller->控制器 Model->模型 Magento是这个星球上最强大的购物车网店平台.当然,你应该已经对此毫无疑问了.不过,你可能还不知道,M ...

  3. 20160331javaweb 之JSP page 指令

  4. C++Primer笔记二

    真是一本好书,就这么点,就感觉学到很多了,当然也是我水平太差. 用shell或者bash的时候有一个文件重定向,就是每次程序运行的时候,我们都需要手动输入内容,然后程序输出内容,这时可以用文件来代替. ...

  5. Candence下对“跨页连接器(off-page connector)”进行批量重命名的方法

    parts.ports.alias等等均可以在“属性编辑器(Property Editor)”中进行查看编辑,并通过复制到Excel等表格软件来进行批量修改.之后再粘贴回去的方法进行批量编辑.但是“跨 ...

  6. 版本控制:集中式 vs 分布式

    集中式 CVCS的版本库集中存放在中央服务器,而工作时都是用自己的电脑,所以要先从中央服务器取得最新的版本,然后工作完后再将自己的代码推送给中央服务器. CVS:最早的.开源.免费.由于自身设计的问题 ...

  7. Cordova5 -- iOS实战(一)

      由于最近公司的项目要求用Cordova来进行开发,便开始了对Cordova的学习.由于本人之前也是做iOS开发,因此相关内容主要从iOS平台的角度来写.刚开始学习Cordova这个平台,希望以此总 ...

  8. java新手笔记19 抽象类

    1.Shap package com.yfs.javase; public class Shape /*extends Object */{ //默认继承object object方法全部继承 //计 ...

  9. Java实战之01Struts2-01简介及环境搭建

    一.Struts2简介 1.Struts2概述 Struts2是Apache发行的MVC开源框架.注意:它只是表现层(MVC)框架. 2.Struts2的来历 Struts1:也是apache开发的一 ...

  10. 10.29_Extjs-lovcombo

    (1) Ext.ux.form.LovCombo多选下拉框 :http://www.iteye.com/topic/340900 (2)combox:icon,lovcombo:icon (3) (4 ...