POJ2528 Mayor's poster 线段树+插入节点建树解法

POJ2528-Mayor's posters 测试数据 POJ2528-Mayor's posters 测试数据。数据来源:Alberta Collegiate Programming Contest 2003.10.18 – 问题G 立即下载

此题和普通的线段树题相比,最大的挑战在于区间太大,如果一开始就建立一个完整的线段树,空间太大。所以,先只建立根节点,每来一组数据,用普通的线段树查找方法沿根节点查找,如果此组数据的子树不存在,则建立子树。最后递归删除线段树。

结果为:

15308kB 80ms

如果最后不删除树,时间所减少,空间增大。为:

20324kB60ms

#include <stdio.h>
#include <string.h>
struct InTree{
    int l,u;
    InTree *left,*right;
    int color;//-2表示该区间是混合色或者还未涂色
    InTree(int low,int upp){
        l= low; u = upp;
        left = right = 0;
        color = -2;
    }
};
void Insert(InTree *root,int low,int upp,int c){
    if(low <= root->l && root->u <=upp){
        root->color = c;
        return;
    }
    else{
        if(root->left == 0){
            root->left = new InTree(root->l,(root->l+root->u)/2);
        }
        if(root->right == 0){
            root->right = new InTree((root->l+root->u)/2+1,root->u);
        }

        if(root->color >= 0){//当本区间是单一色时,需要将颜色下推
            root->right->color = root->left->color = root->color;
            root->color = -2;
        }

        if(low <= (root->l+root->u)/2){
            Insert(root->left,low,upp,c);
        }
        if(upp >= (root->l+root->u)/2 + 1){
            Insert(root->right,low,upp,c);
        }
    }
}

void Query(InTree *root,bool *map){
//查询root子树中全涂成一种颜色的区间,并将区间的颜色对应的map位置置为true
    if(root == 0)
        return;
    else if(root->color >=0)
        map[root->color] = true;
    else{
        Query(root->left,map);
        Query(root->right,map);
    }
}

void Delete(InTree *root){
//递归删除节点
    if(root == 0)
        return;
    else{
        Delete(root->left);
        Delete(root->right);
        delete root;
    }
}
int main(){
    int c;
    int n;
    bool *map = new bool[10000];
    scanf("%d",&c);
    while(c>0){
        --c;
        scanf("%d",&n);
        InTree* root = new InTree(1,10000000);
        int low,upp;
        for(int i=0;i<n;i++){
            scanf("%d %d",&low,&upp);
            Insert(root,low,upp,i);
        }
        memset(map,0,10000*sizeof(bool));
        Query(root,map);
        int cnt=0;
        for(int i=0;i<n;i++){
            if(map[i])cnt++;
        }
        printf("%d\n",cnt);
        Delete(root);
    }
    return 0;
}

/*
2528:Mayor's posters
查看 提交 统计 提示 提问
时间限制: 1000ms 内存限制: 65536kB
描述
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.
输入
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 li 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 <= li <= ri <= 10000000. After the i-th poster is placed, it entirely covers all wall segments numbered li, li+1 ,... , ri.
输出
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.


样例输入
1
5
1 4
2 6
8 10
3 4
7 10
样例输出
4
*/

手把手教你用TI MOSFET搭建0-100mA恒流源电路(附避坑指南) 本文详细介绍了如何使用TI MOSFET SI1204D搭建0-100mA恒流源电路,包括基础原理、电路设计、PCB布局和热管理技巧。通过分步指导和避坑指南,帮助工程师实现高精度、低成本的电流控制方案,适用于LED驱动、传感器激励等多种应用场景。 阅读详情

相关推荐

风控要略-互联网业务反欺诈之路(一)

当前中国互联网安全产业答题可以分为基础安全和业务安全两个领域。从互联网诞生至2014年,互联网安全行业关注的热点基本都聚焦在网络安全、系统安全和应用安全这个三大基础安全领域上,“DDOS“(分布式拒绝服务攻击)1、“漏洞“、“拖库“2和“挂马“3等大家耳熟能详的术语也是从这些领域中衍生出来的。2014年前后,随着互联网业务的爆炸式发展,黑产团伙开始从“攻击渗透系统“的传统套路进化到“利用业务风控确实进行大规模牟利“的模式,并且逐渐形成规模庞大、分工明确的黑色产业链。

Despacito1006的博客 1012

学习笔记——线段树

线段树 本文主要来自百度百科和这篇blog 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 长这样 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。 基本结构与建造 线段树是建立在线段的基础上,每个结点都代表了一条线段[a,b]。长度为1的线段称为元线段。非元线段都有两个子结点,左结点代表的线

No_wonder の 小站 523

Clock Gating设计陷阱:为什么你的ICG cell总是导致setup violation?(附解决方案)

本文深入分析了数字IC设计中ICG(Integrated Clock Gating)单元导致setup时序违规的常见问题,包括时钟偏斜和数据路径过长两大核心原因。通过量化分析影响因素,提供了逻辑重组、寄存器重定时等优化策略,并介绍了预防性设计方法和物理实现阶段的优化技巧,帮助工程师有效解决ICG相关的setup violation问题。

weixin_29168153的博客 204

【原创】一维线段树的建树、插入、遍历和删除

一、定义: 线段树,说白了,就是把线段储存在一棵树里。 举一个例子: 数轴上,有一条线段[1,9]:12345678 将其二分:          12345678        1234    5678     12 34       56 78 1 2 3 4           5 6 7 8 这就是一棵线段树。 把数字换成线段,更清楚: 用严谨一点的语言,是一

致上 5354

SQL注入-靶场通关 Less 1-21

打开Burp工具--打开内嵌浏览器--进入靶场第六关--打开拦截--输入?id=1',如果是正确的,说明不存在注入点,如果错误,说明存在注入点,这里是错误的,需要加上注释--+,在回车看结果是正确的,说明找到了注入点。工具,打开内嵌浏览器,打开拦截,输入http://127.0.0.1/sqli-labs-master/Less-9,然后发送到。id=1'--+,后面都注释了,单引号不闭合,报错说明是数字型SQL注入。设置休眠时间为10s,如果执行SQL语句就会加载,说明正确,存在注入点。

weixin_72104324的博客 1392

深入构建加密货币价格预测系统:从数据获取到模型优化的完整指南!

🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 1276

线段树的基本使用

线段树的基本使用综述线段树使用的场合线段树的基本图解线段树的结构线段树如何建立线段树如何进行操作线段树的代码实现线段树解决实际问题 本人为在校非计算机专业学生,才疏学浅,如有错误,恳请斧正… 本博文适用于未接触过线段树的同学使用,只涉及简单的线段树使用,算法巨佬请忽略 综述 线段树(Segment Tree)通俗地说是一种可以对一段固定区间内的数据进行较大规模改动查询的数据结构,是一种对于RMQ ...

chicken 1082

3DGS-to-PC实战指南:零代码实现3D高斯场景到点云/Mesh的高效转换

本文详细介绍了3DGS-to-PC工具如何实现3D高斯场景到点云/Mesh的高效转换,无需代码即可完成。通过实战案例和参数调优技巧,帮助用户快速掌握这一开源插件的使用方法,提升3D数据处理效率。特别适合建筑扫描、影视特效等领域的专业人士。

q1w3e5r7t9y的博客 273

5.7、线段树

信息学竞赛中经常会碰到一些跟区间有关的问题,比如:给定一些区间线段求并区间的长度,或并区间的个数等。通常情况下数据范围非常大时,使用朴素方法的时间复杂度过高,导致不能在规定时间内得到问题的解。

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 834

解决nfs挂载根文件系统报错:VFS: Unable to mount root fs via NFS, trying floppy.

解决nfs挂载根文件系统报错的问题:VFS: Unable to mount root fs via NFS, trying floppy.

汉尼拔勇闯天涯 4573

DAGGER vs 传统模仿学习:为什么数据聚合能提升模型性能?

本文深入对比了DAGGER与传统模仿学习,揭示了传统方法因“分布不匹配”导致性能下降的根源。DAGGER通过动态的**数据聚合**机制,在智能体自身策略产生的状态分布上收集专家数据,从根本上解决了误差累积问题,从而显著提升了模型在实际部署中的鲁棒性和性能。

weixin_29170327的博客 234

POJ2528 Mayor's poster 线段树+离散化解法

标准解法是用的离散化。此题的特殊性在于普通离散化后,两个相邻的值之间的区间也可能是有效的区间。例如: 有三张海报[1, 4] [5, 6][1, 6],离散化后1->1, 2->4, 3->5, 4->6。他们就会覆盖[1, 6]这张海报。 另外三张海报[1, 3] [5, 6][1, 6],离散化后1->1, 2->3, 3->5, 4->6。他们不会覆盖[1, 6]这张海报。 而此时两组

moonswap的博客 938

基于YOLOv8和PaddlepaddleOCR的微信截图聊天记录提取

本文提出了一种基于YOLOv8和PaddleOCR的微信聊天记录提取方法。首先使用YOLOv8n模型分割出聊天气泡(针对深浅色模式分别训练),通过合成数据集增强模型鲁棒性,召回率达0.995。随后采用PP-OCRv5进行文本识别,利用坐标匹配将气泡内文本送入识别队列,短长文本平均置信度分别>0.98和>0.95。文中特别强调了PaddleOCR不同版本的输出格式差异及适配方案,建议使用3.0+版本。该方法有效解决了直接OCR识别易受干扰的问题,通过气泡分割+文本定位的两阶段策略显著提升了识别准确

2401_87383958的博客 2354

POJ_2528 Mayor's poster(线段树+离散化)

题目请点我 题解: 这道题与之前的题目相比重点在于一个映射的预处理,题目所给的区间达到10000000,而最多只有10000个点,如果直接建树的话太过于空旷。把这些区间的左右节点一一对应,最多有4×10000个点,远小于之前的10000000,而且区间之间的对应关系也不会改变。 举个例子: 区间:[2,6],[4,8],[6,10] 我们进行下面对应: 2 4 6 8

EaShion1994的专栏 765

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

线段树及其基本操作

下图是对线段[1,10)建立的一棵线段树基本结构 1.每个节点都是一个[a,b)的区间,根节点代表了整个所要处理的区间 2. 对于每个非叶节点[a,b),令mid = (a + b) / 2;则其左右儿子节点代表的区间为[a,mid),[mid,b) 3.二叉的组织结构 4. 线段树是一个平衡树,树的高度为logN 5. 线段树把区间上的任意一条长度为L的线段都分成不超过

ACM,再见! 3074

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

线段树

功能线段树是线段组成的(二叉)树,可以解决许多区间问题。因为他的灵活性和较高的效率(二叉树,效率为log2级别的),甚至常常可以取代树状数组和RMQ等区间算法(树状数组只能向上修改,向下取值,RMQ无法即时修正,而线段树这两个问题都可以解决)。需要注意的是线段分两种:不重叠和重叠(点和真正的线段)。下面以不重叠为例。1.建树首先tr[1].L肯定就是左端点,tr[1].R是右端点,然后就需要推左子树

ZigZagK的博客 712

VC中sqlite的使用

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

线段树初步

线段数初步,构建简单的线段树,巧用key值

K_Kelly_的博客 124

POJ - 2528 Mayor's posters(区间覆盖,离散化)

POJ - 2528 Mayor’s posters 题目 给出 n 段区间,区间按给出的顺序会覆盖掉前面的区间,问最后能看到多少不同的区间。 分析 这题只需要用到懒惰标记即可,线段树没有维护什么东西,有懒惰标记 c 代表这个区间被 c 覆盖了。 只不过要用到离散化,题目给出的数据我们只在乎他们的相对大小,相对大小才会影响到区间覆盖的结果 。 通常离散化的时侯是离散到连续的区间,但是有问题,比如数...

Stormjing的博客 311

[漂浮法]POJ2528 Mayor's posters

当初这题用线段树搞爆,离散化然后建树搞搞搞,辛苦AC。 其实这题用漂浮有奇效,不用离散,而且是线段,覆盖写起来简单。 想法很简单,贴在下面的海报就放在下面,然后从下网上浮,遇到其他的海报就断成一截或两截继续上浮。 还有个问题,这题的坐标表示的不是端点,而是一小段。 比如有两张海报,1 3和4 6,那么其实1到6都是被覆盖了的。 所以截断海报的时候加减一处理边界。 用DFS实现。

穹妹的家 795

数据结构:线段树

已迁往:http://www.wypblog.com/archives/144一、线段树基本概念 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区...

runfeel 456

线段树算法(Segment Tree)

【代码】线段树基础知识。

1476

线段树(动态建点)

敌兵布阵

Jimmy_King 486

数据结构:线段树实现详解

线段树C/C++实现数据类型构造基本操作构造线段树添加结点删除结点查询结点实现原理构造线段树添加结点删除结点查询结点C++代码实现构建线段树添加结点删除结点查询结点Lazy tags优化实例应用 本质为 加了左右端点的树形结构 数据类型构造 struct node{ int l,r; //l左端点 r右端点 int val; //val值域 }n[maxn]; //n[i]表示标号为i的树的结点 基本操作 构造线段树 void make(int left,int right, i

Leon14138的博客 1779

POJ 2828 线段树单点插入

Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 17137 Accepted: 8498 DescriptionRailway tickets were difficult to buy around the Lunar New Year in China, so we must get up e

仰望天空 651

BZOJ1012 线段树插入???

题意:维护一个数列,俩种操作,2e5Q查询:末尾开始,数L个数,问最大的数A插入:末尾插入值(n+t)%D,t为上次查询的结果,最开始t=0思路:学习大佬的思路查询:维护区间最大值插入:这种是尾插入,每次插入都暴力build到叶子,并向上更新(logn)注意:线段树一般来说是不支持插入删除的,想想都觉得蛋疼920ms思维难度:0.7   实现难度:0.4#include&lt;stdio.h&gt...

animalcoder 624
上一篇: poj3439 A Simple Problem with Integers 延迟更新的线段树
下一篇: POJ2528 Mayor's poster 线段树+离散化解法
PhoenixDead
博客等级 码龄14年 8粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值