POJ 2528 Mayor's posters (线段树+离散化)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions:75394 | Accepted: 21747 |
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 思路:
好久没有写博客了,做这个题,我写了一整天,就因为一句话没有写好,我实在是想骂人呀!
首先离散化,避免超时,避免超内存,这个我相信你在别的博客上可以看见,我就不多说,线段树的节点里面,存的是下面全部相同的数字,也就是说,如果这个节点,代表的是l到r的范围内的数,
如果l到r里面,数字完全相同,那么,这个节点就存下这个数,否则,那我们就存下-1.如果查询的时候遇到-1,那我们就继续向下查询就行了,直到查到不为-1或到达叶子节点为止。
我的错误是update的最后一行,忽略了下面两个节点都是-1的情况
AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int s[400086];
bool book[400086];
struct node
{
int l,r,num;
bool lazy;
}tree[1600099];
int x[100086],y[100086]; void build(int t,int l,int r)
{
tree[t].l=l;tree[t].r=r;
tree[t].num=-1;tree[t].lazy=false;
if(l==r){return;}
int mid=(l+r)/2;
build(t<<1,l,mid);
build((t<<1)|1,mid+1,r);
} void push_down(int t)
{
tree[t].lazy=false;
tree[t<<1].num=tree[t].num;
if(tree[t<<1].l!=tree[t<<1].r){tree[t<<1].lazy=true;} tree[(t<<1)|1].num=tree[t].num;
if(tree[(t<<1)|1].l!=tree[(t<<1)|1].r){tree[(t<<1)|1].lazy=true;}
} void update(int t,int l,int r,int e)
{
if(tree[t].lazy){push_down(t);}
if(tree[t].l==l&&r==tree[t].r){
tree[t].num=e;
if(l!=r){tree[t].lazy=true;}
return;
} int mid=(tree[t].l+tree[t].r)>>1;
if(r<=mid){update(t<<1,l,r,e);}
else if(l>mid){update((t<<1)|1,l,r,e);}
else{
update((t<<1),l,mid,e);
update((t<<1)|1,mid+1,r,e);
}
if(tree[t<<1].num!=tree[(t<<1)|1].num||tree[t<<1].num==-1||tree[(t<<1)|1].num==-1){tree[t].num=-1;}
} int query(int t)
{
int ans=0;
if(tree[t].num==-1){
if(tree[t].lazy){push_down(t);}
if(tree[t].l==tree[t].r){return 0;}
ans+=query(t<<1);
ans+=query((t<<1)|1);
}
else{
if(!book[tree[t].num]){book[tree[t].num]=true;return 1;}
}
return ans;
} int main()
{
int T,n;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(book,0,sizeof(book));
memset(s,0,sizeof(s));
int nn=0;
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
s[++nn]=x[i];s[++nn]=y[i];
}
sort(s+1,s+nn+1);
int siz=unique(s+1,s+nn+1)-s-1;
int k=siz;
for(int i=1;i<=k-1;i++){
if(s[i+1]-s[i]>1){s[++siz]=s[i]+1;}
}
sort(s+1,s+siz+1);
build(1,1,siz);
int l,r;
for(int i=1;i<=n;i++){
l=lower_bound(s+1,s+siz+1,x[i])-s;
r=lower_bound(s+1,s+siz+1,y[i])-s;
update(1,l,r,i);
}
printf("%d\n",query(1)); }
}
POJ 2528 Mayor's posters (线段树+离散化)的更多相关文章
- 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 [ ...
- 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 (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
- POJ 2528 Mayor’s posters (线段树段替换 && 离散化)
题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000).求出最后还能看见多少张海报. 分析 ...
- 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 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...
- POJ 2528 Mayor's posters (线段树)
题目链接:http://poj.org/problem?id=2528 题目大意:有一个很上的面板, 往上面贴海报, 问最后最多有多少个海报没有被完全覆盖 解题思路:将贴海报倒着想, 对于每一张海报只 ...
随机推荐
- MySQL——安装、配置、启动服务、
1.环境变量配置 将启动连接,加入环境变量中. mysqld :启动服务端 msysql -u 用户名 -p 密码 : 启动客户端 2.windows服务:一直在运行中 E:\wupeiqi\mys ...
- hadoop安装要领
1.安装JDK tar -zxvf jdk-7u75-linux-i586.tar.gz -C /root/training/ vi ~/.bash_profile JAVA_HOME=/root/t ...
- windows 下 mysql服务的注册和删除
注册: mysqld --install 服务名 --defaults-file="C:\Mysql\mysql-5.7\my.ini" 删除 sc delete 服务名 停止服务 ...
- UOJ356 [JOI2017春季合宿] Port Facility 【启发式合并】【堆】【并查集】
题目分析: 好像跑得很快,似乎我是第一个启发式合并的. 把玩具看成区间.首先很显然如果有两个玩具的进出时间有$l1<l2<r1<r2$的关系,那么这两个玩具一定在不同的栈中间. 现在 ...
- CetenOS 6.9 搭建hubot运维机器人
前言 Hubot是由Github开发的开源聊天机器人,基于Node.js采用CoffeeScript编写 可以借助Hubot开发Chatbot来自动化的完成想要一切自动化任务,比如: -运维自动化(编 ...
- Ionic3的http请求如何实现token验证,并且超时返回登录页
要求 后台提供的接口,不能让人随便输入个链接就能访问,而是要加入一个token,token是动态的,每次访问的时候判断,有权限并且未过期的时候才可以访问接口. 后台的设计是 在登录的时候,首先要pos ...
- SCOI2016 Day1 简要题解
目录 「SCOI2016」背单词 题意 题解 代码 「SCOI2016」幸运数字 题意 题解 总结 代码 「SCOI2016」萌萌哒 题意 题解 总结 代码 「SCOI2016」背单词 题意 这出题人 ...
- linux添加lvm磁盘大小,命令行创建swap
添加硬盘 添加一块硬盘. 重新扫描硬盘 echo "- - -" > /sys/class/scsi_host/host0/scan echo "- - -&quo ...
- 如何改变Android标准键的颜色?
本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何改变Android标准键的颜色 ...
- iptables(4)规则编写
/etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Tue Mar 20 15:05:33 2018*filter:INPUT ...