题解 UVA10587 【Mayor's posters】
先讲一下:dalao @lisuier 发布的前一篇题解严格来讲是有错误的
比如下一组数据:
1
3
1 10
1 4
7 10
显然答案是3,然而用lisuier dalao的程序做出来的答案是2(后面会讲错误原因)
简单看出这道题用线段树可解
so
我们用离散化+权值线段树(戳这里详解)
实际上是安利自己博客
思路:建一棵空数,然后把某一区间的颜色更新为读入的颜色;
WA,SO EASY
OK
那我们先建一棵(10^7*4)的空树
然后
空间就炸了
正经的处理方法
对区间端点进行离散化
接下来
引用一下的 @lisuier 的话
离散化,如下面的例子,因为单位1是一个单位长度,将下面的
1 2 3 4 6 7 8 10
— — — — — — — —
1 2 3 4 5 6 7 8
离散化 X[1] = 1; X[2] = 2; X[3] = 3; X[4] = 4; X[5] = 6; X[7] =8; X[8] = 10
这样我们就优化了空间
对一般的离散化来说,这很对,
但是
再看这一组数据
1
3
1 10
1 4
7 10
用该方法离散化后
第二张海报与第三张海报中间的间隔就消...消失了
也就是说第一张海报就看不到了(手动模拟一下发现是能看到的)
处理方法:离散化时,加到临时数组b中的右端点+1也加到临时数组中
看起来是这样的
int init(){//读入并进行离散处理
n = read(); tot=0;
for(int i = 1;i <= n;i++)
a[i].l = read(),a[i].r = read(),
b[++tot] = a[i].l,b[++tot] = a[i].r,b[++tot] = a[i].r + 1;//加入右边的端点+1
sort(b + 1,b + tot + 1);
int len=unique(b + 1,b + tot + 1) - b - 1;
for(int i = 1; i <= n;i++)
a[i].l = lower_bound(b + 1,b + len + 1,a[i].l) - b,
a[i].r = lower_bound(b + 1,b + len + 1,a[i].r) - b; //下面是正常的离散化
return len; //离散化后总共处理多长的墙;
}
更新之类的与普通线段树差不多
但是要注意push_down操作和query操作
比如说询问时已经访问过得颜色要标记一下
接下来是
简单易懂
的代码.
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define M 20005
using namespace std;
inline int read(){
char chr=getchar(); int f=1,ans=0;
while(!isdigit(chr)) {if(chr=='-') f=-1;chr=getchar();}
while(isdigit(chr)) {ans=ans*10;ans+=chr-'0';chr=getchar();}
return ans*f;
}
int ans = 0;
struct segment
{
int l,r;
}a[10005 << 4];
bool vis[20005 << 4];
struct node
{
int l,r,val,lazy,sum;
int mid()
{
return l + r >> 1;
}
}t[M << 4];
int b[20005 << 4],n,tot=0,x,y;
int init()
{//读入并进行离散处理
n = read();
tot = 0;
for(int i = 1;i <= n;i++)
a[i].l = read(),
a[i].r = read(),
b[++tot] = a[i].l,
b[++tot] = a[i].r,
b[++tot] = a[i].r + 1;
sort(b + 1,b + tot + 1);
int len=unique(b + 1,b + tot + 1) - b - 1;
for(int i = 1; i <= n;i++)
a[i].l = lower_bound(b + 1,b + len + 1,a[i].l) - b,
a[i].r = lower_bound(b + 1,b + len + 1,a[i].r) - b;
return len; //离散化后总共处理多长的墙;
}
void push_down(int i){
if(t[i].val == -1) return;
t[i << 1].val = t[i << 1 | 1].val = t[i].val;
t[i].val = -1;
}
void build(int i,int l,int r)
{
t[i].l = l;
t[i].r = r;
t[i].val = 0;
if(l == r)
{
return;
}
int m=t[i].mid();
build(i << 1,l,m);
build(i << 1 | 1,m + 1,r);
}
void updata(int i,int l,int r,int x)
{
if(l <= t[i].l && t[i].r <= r)
{
t[i].val = x;
return;
}
push_down(i);
int m = t[i].mid();
if(l <= m)
updata(i << 1,l,r,x);
if(r > m)
updata(i << 1 | 1,l,r,x);
}
void query(int i,int l,int r)
{
if(t[i].val != -1)
{
if(!vis[t[i].val])
{
vis[t[i].val] = 1;//做标记
++ans;
}
return;
}
query(i << 1,l,r);
query(i << 1 | 1,l,r);
}
int ask(int l,int r)
{
memset(vis,0,sizeof(vis));
ans = 0;
vis[0] = 1;
query(1,l,r);
return ans;
}
int main()
{
int T = read();
while(T--)
{
int m=init(); tot=0;//海报染成的颜色
build(1,1,m);
for(int i = 1;i <= n;i++)
updata(1,a[i].l,a[i].r,++tot);
printf("%d\n",ask(1,m));
}
return 0;
}
题解 UVA10587 【Mayor's posters】的更多相关文章
- POJ2528 Uva10587 Mayor's posters
The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign h ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- poj2528 Mayor's posters(线段树之成段更新)
Mayor's posters Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 37346Accepted: 10864 Descr ...
- 【POJ】2528 Mayor's posters ——离散化+线段树
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of Bytetown, A ...
- Mayor's posters(离散化线段树)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 54067 Accepted: 15713 ...
- 线段树---poj2528 Mayor’s posters【成段替换|离散化】
poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...
- poj 2528 Mayor's posters 线段树区间更新
Mayor's posters Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=2528 Descript ...
- 【poj2528】Mayor's posters
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 64939 Accepted: 18770 ...
- POJ 2528 Mayor's posters
Mayor's posters Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Sub ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
随机推荐
- Vue中this.$router.push参数获取(通过路由传参)【路由跳转的方法】
传递参数的方法: 1.Params 由于动态路由也是传递params的,所以在 this.$router.push() 方法中 path不能和params一起使用,否则params将无效.需要用nam ...
- 28 I/O限制的异步操作
28.2 C#的异步函数 private static async Task<string> IssueClientRequestAsync(string serverName, stri ...
- STL源码分析之内存池
前言 上一节只分析了第二级配置器是由多个链表来存放相同内存大小, 当没有空间的时候就向内存池索取就行了, 却没有具体分析内存池是怎么保存空间的, 是不是内存池真的有用不完的内存, 本节我们就具体来分析 ...
- 新版本的molar mass(uva-1586)明明debug过了,各种测试还是WA真是气死我了
#include <bits/stdc++.h> using namespace std; double trans(string a) { stringstream ss; ss< ...
- Centos6防火墙基本配置
1. 允许x.x.x.x访问本机 iptables -I INPUT -p tcp -j DROP #若要添加多了ip,该条也是只执行一次 iptables -I INPUT -s x.x.x.x - ...
- Eclipse中使用struts标签时出错
原因是Action和ActionForm对应文件中没有继承相应的类,具体来说: ActionForm的编写: 必须继承org.apache.struts.action.ActionForm Actio ...
- Fedora15下安装Android开发环境
Fedora15下安装Android开发环境需要以下步骤: 完整步骤. 1. 安装正确版本的JDK. 2. 安装Eclipse. 3. 安装ADT. 4. 安装Android SDK. 5. 安 ...
- 洛谷——P1031 均分纸牌
https://www.luogu.org/problem/show?pid=1031#sub 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以 ...
- gap lock/next-key lock浅析 Basic-Paxos协议日志同步应用
http://www.cnblogs.com/renolei/p/4673842.html 当InnoDB在判断行锁是否冲突的时候, 除了最基本的IS/IX/S/X锁的冲突判断意外, InnoDB还将 ...
- Oracle 堵塞(blocking blocked)
堵塞是DBA常常碰到的情形,尤其是不良的应用程序设计的堵塞将导致性能严重下降直至数据库崩溃. 对DBA而言,有必要知道怎样定位到当前系统有哪些堵塞,究竟谁是堵塞者,谁是被堵塞者.本文对此给出了描写叙述 ...