Mayor's posters POJ - 2528(离散化+成段更新+区间统计)

poj-2528 Mayor's posters 测试数据及答案 立即下载

Mayor's posters

POJ - 2528

The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally decided to build an electoral wall for placing the posters and introduce the following rules:
  • 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
The first line of input contains a number c giving the number of cases that follow. The first line of data for a single case contains number 1 <= n <= 10000. The subsequent n lines describe the posters in the order in which they were placed. The i-th line among the n lines contains two integer numbers l i and ri which are the number of the wall segment occupied by the left end and the right end of the i-th poster, respectively. We know that for each 1 <= i <= n, 1 <= l i <= ri <= 10000000. After the i-th poster is placed, it entirely covers all wall segments numbered l i, l i+1 ,... , ri.
Output
For each input data set print the number of visible posters after all the posters are placed.

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

看到网上博客写的很好直接粘这了

点击打开链接

题意:先输入case数,每个case输入n,表示下面有n个海报,每行就是海报的左右坐标,第i个海报的颜色为i。一面墙长度固定为10000000,问这些海报贴上去后能看到多少种颜色

这个问题的难处其实是怎么离散化(也就是映射,映射后就是简单的线段树整段更新,最后区间询问)。

int s[MAXN][2];  保存原始的数据,[0]是起点坐标,[1]是终点坐标,那么一共产生2*n个端点

struct point
{
int a,n,f;  //端点坐标,属于哪条线段,起点或者终点
}p[2*MAXN];

所以把2*n个端点逐一放入p数组中,并且要记录这个端点是来自哪条线段(n这个域),在这条线段中是起点还是终点(f这个域)

然后对p数组排序,以端点坐标大小排序(a这个域)

 

接下来是映射,例如排序后的结果为

10,21,38,40,40,59

映射为

1,2,3,4,4,5

也就是说按数字大小映射,而且也可以发现,最后的5其实也代表了有多少个不同的数字

这个映射的结果一定包含[1,m]的所有整数,等下我们要建线段树的时候,总区间的长度就是[1,m]

m最大可以去到80000(60000也行),80000怎么来的,是2*10000*4

因为海报的个数最多10000,有20000个端点,极端情况下,这20000个点都不一样,映射过去的话,就是[1,20000],也就是m最大可以是m

回想一般情况下,线段树的总区间为[1,m]的话,我们开辟线段树的数组一般为4*m(其实开到3*m就足够了),所以这就是为什么80000的原因

 

说回头,我们扫过p数组的时候,每得到一个点,就先映射它的坐标(和它前面那个端点坐标比较是否不同,不同的话,就是一个新的点,具体看代码),然后看它是来自哪条线段(映射后同样是这条线段),再看它在原线段中是起点还是终点,然后相对应地记录现在线段的起点和终点

 

最后映射后的线段信息全部在下面的数组中

struct interval //离散化后的线段
{
int l,r,col;
}in[MAXN];

 

得到了它,就可以建树,整段更新,查询了


code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 10010
using namespace std;
bool used[MAXN];//查询时记录哪些颜色已经被计数
int s[MAXN][2],N;//s数组记录原始数组
struct point{
    int a,n,f;//端点坐标,属于哪条线段,起点或者终点
}p[2*MAXN];
struct interval{//离散化后的线段
    int l,r,col;
}in[MAXN];
struct segment{//线段树节点
    int l,r,col,val;//val表示这个区间是否已经有一张海报完全覆盖
}Tree[MAXN*8];

int query(int l,int r,int rt){
    int col = Tree[rt].col;
    if(Tree[rt].val){
        if(!used[col]){
            used[col] = 1;
            return 1;
        }
        else
            return 0;
    }
    int mid = Tree[rt].l + Tree[rt].r >> 1;
    return query(l,mid,rt<<1) + query(mid+1,r,rt<<1|1);
}

void update(int l,int r,int col,int rt){
    if(Tree[rt].val && Tree[rt].col == col)
        return;
    if(Tree[rt].l == l && Tree[rt].r == r){
        Tree[rt].col = col;
        Tree[rt].val = 1;
        return;
    }
    if(Tree[rt].val){
        Tree[rt<<1].val = Tree[rt<<1|1].val = Tree[rt].val;
        Tree[rt<<1].col = Tree[rt<<1|1].col = Tree[rt].col;
        Tree[rt].val = 0;
    }
    int mid = Tree[rt].l + Tree[rt].r >> 1;
    if(l > mid)
        update(l,r,col,rt<<1|1);
    else if(r <= mid)
        update(l,r,col,rt<<1);
    else{
        update(l,mid,col,rt<<1);
        update(mid+1,r,col,rt<<1|1);
    }
}

void build(int l,int r,int rt){
    Tree[rt].l = l;
    Tree[rt].r = r;
    Tree[rt].val = 0;
    Tree[rt].col = 0;
    if(l == r) return;
    int mid = l + r >> 1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
}

bool cmp(point x,point y){
    return x.a < y.a;
}

int main(){
    int Cas;
    scanf("%d",&Cas);
    while(Cas--){
        scanf("%d",&N);
        //离散化
        for(int i = 1; i <= N; i++){
            scanf("%d%d",&s[i][0],&s[i][1]);
            p[2*i-1].a = s[i][0];
            p[2*i-1].n = i;
            p[2*i-1].f = 0;
            p[2*i].a = s[i][1];
            p[2*i].n = i;
            p[2*i].f = 1;
        }
        sort(p+1,p+2*N+1,cmp);
        p[0].a = p[1].a;
        int m = 1,n,f;
        for(int i = 1; i <= 2*N; i++){
            n = p[i].n;
            f = p[i].f;
            if(p[i].a != p[i-1].a) m++;
            if(!f){
                in[n].l = m;
                in[n].col = n;
            }
            else{
                in[n].r = m;
                in[n].col = n;
            }
        }
        //离散化结束
        build(1,m,1);
        for(int i = 1; i <= N; i++){
            update(in[i].l,in[i].r,in[i].col,1);
        }
        memset(used,0,sizeof(used));
        printf("%d\n",query(1,m,1));
    }
    return 0;
}


超详细neo4j安装教程 一、neo4j简介 最近开始学习知识图谱,所以首先想先学习一下neo4j的使用。 Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。由于知识图谱中存在大量的关系型信息(实体—关系—实体), 使用结构化数据库进行存储将产生大量的冗余存储信息, 因此将图数据库作为知识图谱的存储容器成为流行的选择。当前较为常用的图数据库主要有 Neo4j 等。 二、neo4j的安装 功能快捷键 撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Co 阅读详情

相关推荐

Android双目摄像头(RGB+IR)实时预览与人脸活体检测实战指南

本文详细介绍了Android双目摄像头(RGB+IR)实时预览与人脸活体检测的实战指南。通过双摄同步预览、人脸检测与活体判断等技术实现,提升安全认证的准确性和鲁棒性。文章还提供了开发环境搭建、常见问题解决方案及性能优化建议,帮助开发者快速掌握双目摄像头在Android平台的应用。

vulkan6gpu的博客 687

(POJ-2528)Mayor‘s posters(区间覆盖+离散化)

题目链接:https://vjudge.net/problem/POJ-2528 这道题问我们最后能看到多少张海报,如果正着想会比较麻烦,因为我们不确定当前的海报是否会被之后的海报所掩盖,但是我们可以肯定的是之后的海报一定不会被他之前的海报所掩盖,所以我们就可以倒着来贴海报,如果当前贴的海报能被看见,说明不会被之后的海报所遮挡,至于怎么查询是否被遮挡,这就是线段树的区间查询问题了。由于题目给的海报的边界比较大,数组无法直接存下,我们只需要存储他们的相对大小关系即可,所以我们需要用到离散化。 但是离散化时

AC__dream的博客 250

MATLAB实战:利用扫频数据重构系统伯德图的关键步骤

本文详细介绍了如何利用MATLAB处理扫频数据并重构系统伯德图的完整实战流程。内容涵盖数据导入与清洗、增益与相位的精确计算、频率响应数据对象(frd)的构建、数据平滑与插值处理,以及最终生成专业伯德图并进行关键参数(如相位裕度)标注的方法。文章重点解决了从实测“黑盒子”系统数据出发,获取直观频率响应特性曲线的核心问题,为控制系统分析与设计提供了实用指南。

weixin_29098117的博客 397

poj 2528 Mayor‘s posters

线段树

weixin_46266058的博客 730

显著性算法 + 伪彩变换

利用opencv得到显著图和伪彩图

正在挣扎中的人 2298

手把手教你打造CTF动态靶场

公司想搞一个CTF比赛,需要一个竞赛靶场,于是这个任务就落在了我的身上,平台是利用CTFd框架,基于docker搭建的动态靶场,搭建过程中遇到的坑比较多,这里我会把每一个遇到的坑都指出来。我搭建的是CTFd的3.X的版本。第一次搭建的话,搭建的过程会有些痛苦,但是搭建完成后会越来越熟练,这个平台的可用性还是很高的。由于搭建的过程中遇到的坑太多了,各种各样的问题,所以决定写下这篇文章,把所有的坑都指出来,也算为后边想搭这个平台的小伙伴指一条路。Taps:资源来源:星海安全实验室如果你也对网络安全&黑客。

Python栈 4931

POJ - 2528 - Mayor's posters (线段树区间覆盖+离散化)

题目:POJ - 2528 题意:n个人依次贴海报,给出每张海报所贴的范围li,ri 。求出最后还能看见多少张海报。 题解:因为范围过大,所以我们考虑离散化,离散化之后把数组的下标作为线段树建树的区间,但是要注意: 如下面的例子(题目的样例),因为单位1是一个单位长度,将下面的 123467810 —————...

Rotepad的博客 326

mysql 学习笔记(1):mysql 基本概念和 mysql workbench 的基本使用方法

…

qq_52740163的博客 1355

B - Mayor's posters

Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u [Submit]   [Go Back]   [Status] Description

mr_lee 345

逻辑判断1-逻辑基础知识

判断推理学习笔记

小y的学习笔记 2130

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3655

POJ 2528 Mayor's posters(成段更新)

题意:有t组测试数据,有n张海报,海报按题目给出的顺序覆盖,问最后能看到几张海报。 要用到离散化。因为题目给出的数字是对应区间的,要把它对应的边界上,可以a[i]--或者b[i]++。建树的时候,边界条件是left+1==right,因为区间是连续的。我把输入的数据,对应一个值,在查询的时候,如果当前的颜色是纯色的,那么就不用在往下查询把,对应的颜色的标记flag[i]表标记上,直接返回,最后判

1763

11、体内皮质功能的电压敏感染料成像技术

本文详细介绍了电压敏感染料成像(VSDI)技术在体内皮质功能研究中的应用。内容涵盖VSDI的技术起源、作用机制、信号特点与解读局限性,以及其在映射感觉皮质功能区方面的优势。文章对比了VSDI与电极记录和钙成像技术的差异,突出了其在高时空分辨率下监测神经元群体亚阈值活动的独特价值。同时,提供了完整的实验操作流程,包括手术步骤、染料应用、光学系统配置及数据分析方法,并总结了常见问题及其解决方案。随着基因靶向和多模态技术结合的发展,VSDI有望进一步提升信号特异性和空间精度,成为解析大脑网络动态的重要工具。

Apple的专栏 77

poj2528 Mayor's posters(成段更新+离散化)

http://poj.org/problem?id=2528 题意:基本和上一题板子上涂颜色一样,只不过这题数据量超大。。 思路:把一条条线段离散化。这题的离散化原理:题中区间:[1,4][2,6][8,10][3,4][7,10],排序去重后变成 1,2,3,4,6,7,8,10 赋其序号为 1,2,3,4,5,6,7,8 这样就减少了空间,但是不影响线段划分。将新

Iguodala的博客 403

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

POJ2528 Mayor's posters

POJ上这道题的数据据说很弱,导致很多实际上错误的代码都

那些年我们切过的题 871

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

POJ 2528 Mayor's posters(线段树成段更新+离散化)

题目链接: http://poj.org/problem?id=2528 题目大意,就是在一个区间贴海报,问最后可见(一点点也算)的海报有几种。 线段树处理区间更新的做法是对的,每给定一个区间,然后成段更新,更新值为i,i为第i张海报,然后用一个vis数组标记出现的,就可以统计有多少个不同的海报了。 但是这题的区间比较大,直接处理会超时,于是学习了离散化的处理方法,其实不用想太多,就是把区间

Algobird 807

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

题目链接:\quadPOJ - 2528题目大意:\quad有一面墙(墙最长1e71e^7),nn张海报,每张海报都和墙等高。每张海报都有一个li和ril_i 和 r_i,表示它会被贴在区间[li,ri][l_i, r_i]上,问所有海报都贴完之后,还能看见几张海报?(多组)数据范围:1≤n≤100001≤li≤ri≤1e7\quad 1 \leq n \leq 10000 \quad 1 \leq

XzzF1024的博客 489

poj2528--Mayor's posters(线段树+离散化)

The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally d...

dsaghjkye的博客 195

POJ 2528 Mayor's posters.

~~~~ 一直MLE,才发现要写离散化操作。其他就是线段树的成段更新(每次用不同标记去更新区间),最后统计下有多少种标记就OK了。 题目链接:http://poj.org/problem?id=2528 大牛写的很详细,请戳:http://blog.youkuaiyun.com/metalseed/article/details/8041334 ~~~~ #include #include #inc

ACM之路,在希望的田野上。 1037

POJ 2528 Mayor's posters 线段树(成段更新+离散化)

题意: 给出N个海报,每个海报有一个长度区间(a,b).按顺序贴在墙上。 问最后可以看到几张海报。 思路: 一想到的就是线段树,对每个区间进行染色,最后查找一共有多少种颜色。 第一次写玩没看数据大小。MLE了。。仔细一看,海报长度1QW。 然后写了个离散化的,300MS+。 又去看了别人的离散化。。神多了。。60MS。。 优化后的离散 #include #include

just_water 1846

POJ2528 Mayor's posters 线段树+离散化

The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finall...

_ostreamBaba 386

POJ-2585-Mayor's posters-成段更新+(hash)离散化思想

题目链接:http://poj.org/problem?id=2528 #include #include #include #include #include #include #include #include #include #include #include #define LL long long using namespace std; // 照着题目数组开10005,给报RE,

wlxsq的专栏 942

POJ 2528 – Mayor's posters

Advanced Data Structures :: Segment Tree Description 在一个很长的墙上贴海报,每张海报的高度和墙一样高。 因此,墙和海报应该被看成线段。 输入即不停得往墙上贴海报。 输出最后墙上可以看到多少张海报(露出一部分也算)。 Type Advanced Data Structures :: Segment Tree

A Code Rabbit 606

poj 2528 Mayor's posters

线段树(经典题) 离散化+成段更新+区间统计 题意:先输入case数,每个case输入n,表示下面有n个海报,每行就是海报的左右坐标,第i个海报的颜色为i。一面墙长度固定为10000000,问这些海报贴上去后能看到多少种颜色 这个问题的难处其实是怎么离散化(也就是映射,映射后就是简单的线段树整段更新,最后区间询问)。今天第一次学离散化,说说个人的解法 方法是和别人的大概一样的,可能代码实现...

weixin_34143774的博客 76

POJ 2528 Mayor's posters

大概题意:有一面很长的墙,按照输入顺序往上面贴海报

Explorers 612

Mayor's posters POJ - 2528 线段树&&离散化

Mayor's posters POJ - 2528 题意 : 在墙上贴海报, n(n&lt;=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1&lt;=li&lt;=ri&lt;=10000000)。求出最后还能看见多少张海报。 分析 : 很容易想到利用线段树来成段置换,最后统计总区间不同数的个数。但是这里有一个问题,就是区间可以很大,线段树开不了那么大的空间,遂想能不能离...

没有梦想何以远行 225
上一篇: A Simple Problem with Integers POJ - 3468(线段树模板)
下一篇: CSU 1803 2016 (逆向思维+同余)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值