poj-2528线段树练习


title: poj-2528线段树练习
date: 2018-10-13 13:45:09
tags:

  • acm
  • 刷题
    categories:
  • ACM-线段树

概述

这道题坑了我好久啊啊啊啊,,,,

到现在也只是理解了kaungbin的代码,,,知道每一步做什么,,,但感觉就是哪里有些不对劲的样子,,,,

这道题有两个点是我感觉很重要的,,,一个是数据的离散化,,,另一个是线段树的变形,,,也就是它所维护的东西和之前见过的不一样了,,,,

分析思路

题意是这样的,,,在一个很大的区间里,,,不停的给每一个区间覆盖海报,,,每个覆盖的海报是不一样的,,然后问你最后一共有几个海报是露出来的,,,

大体上的思路是与所给贴海报相反的顺序贴海报,,,这样的话第一张(也就是原来顺序的最后一张)一定是全露出来的,,然后第二张(也就是原来顺序的倒数第二张)如果是在第一张的区间里说明它就被完全覆盖了,,如果是在第一张以外的其他地方,,,就说明这张也一定是露出来的,,,以此类推,,对于每一次判断出是露出来的++ans,,,最终全处理了就得到了答案,,,数据要离散后再用,,,

可以看出这样的写法中线段树只是用来判断每一次的贴海报,,,也就是说,,,线段树只是用来维护每一个区间是否被覆盖(更新),,,同时返回所要覆盖的区间是否有露出来的(查询),,,所以更新和查询的操作可以合并在一起,,,,

实现

数据的离散化

先说一下离散怎么实现:

首先原数据保存到x[maxn]数组,,,

然后把所有的数据复制到另一个数组a[maxn],,,

对其排序,,,

去重,,,

然后对去重的数组a[maxn]遍历进行离散,,,

这样想要知道知道原来数据中x所对应离散后的位置就为hash[x],,,

sort(a , a + count);
count = unique(a , a + count) - a;
for(int i = 0; i < count; ++i)hash[a[i]] = i;

最后的代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>using namespace std;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
const int maxn = 1e5 + 10;
struct node
{int l;int r;bool cov;       //表示这个节点所代表的区间是否被覆盖
}node[maxn << 2];struct poster       //表示海报的结构体
{int l;int r;
}poster[maxn << 2];void build(int rt , int l , int r)
{node[rt].l = l;node[rt].r = r;node[rt].cov = false;   //每一个区间初始化为未覆盖if(l == r)  return;int mid = (l + r) >> 1;build(lson);build(rson);
}bool post(int rt , int l , int r)
{//当前节点,所要覆盖的额区间[l , r]if(node[rt].cov)    return false;                   //若这个区间已经被覆盖直接返回if(node[rt].l == l && node[rt].r == r){node[rt].cov = true;                            //未覆盖的前提下找到整个区间时return true;}bool res;int mid = (node[rt].l + node[rt].r) >> 1;if(r <= mid)    res = post(rt << 1 , l , r);else if(l > mid)res = post(rt << 1 | 1 , l , r);else{bool r1 = post(rt << 1 , l , mid);bool r2 = post(rt << 1 | 1 , mid + 1 , r);res = r1 || r2;                                 //当跨两个区间时,,,要分别判断是否都是被覆盖的,,有一个没覆盖即露出就说明这个区间有露出的}if(node[rt << 1].cov && node[rt << 1 | 1].cov)      //两个子区间都露出父节点也是露出node[rt].cov = true;return res;
}int a[maxn];
int hash[10000010];int main()
{int T;scanf("%d" , &T);while(T--){int n;scanf("%d" , &n);int count = 0;for(int i = 0; i < n; ++i){scanf("%d%d" , &poster[i].l , &poster[i].r);a[count++] = poster[i].l;a[count++] = poster[i].r;//相邻存点}//离散sort(a , a + count);count = unique(a , a + count) - a;for(int i = 0; i < count; ++i)hash[a[i]] = i;build(1 , 0 , count - 1);int ans = 0;for(int i = n - 1; i >= 0; --i)             //反着遍历,,有露出的就增一if(post(1 , hash[poster[i].l] , hash[poster[i].r]))++ans;printf("%d\n" , ans);}
}//一个缺点,,,这样单纯的离散数据会出错,,,像这一组,,,
//但是poj上没有考虑这种情况,,,,应该是标程的离散也是这样把,,,,,,
//3
//1 10
//1 3
//6 10
//2
//应该是3

总结

  • 暑假时接触过一次数据的离散化,,,但是当时只是会用就行,,,最终还是忘记了,,,只知道这样一个名词,,,这次花了点时间记忆了一下,,,但是还是没有仔细深入的看看,,,因为以前看到的离散化时用的lower_bound(),,,,而且操作更加的复杂,,,过一段时间再看看把,,,,

  • 看到网上好多人用的线段树的结构和之前写的那样一样,,,build(),update(),query(),,,但就是理解不了,,,QAQ,,,看了kuangbin的写法反到理解了,,,虽然基本是照搬过来的,,,,再过几天要重写一遍,,,

(end)

转载于:https://www.cnblogs.com/31415926535x/p/9782804.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] 当使用opacity时会使得元素的子元素也透明,此时不想要子元素也跟着透明怎么办?

[css] 当使用opacity时会使得元素的子元素也透明&#xff0c;此时不想要子元素也跟着透明怎么办&#xff1f; 当父元素使用opacity时&#xff0c;子元素也会继承该透明度&#xff0c;即使重新设置透明度也不行。楼上的两种方法要么是放弃使用opacity&#xff0c;要么是放弃使用…

[css] 在css中为什么说不建议使用@import?

[css] 在css中为什么说不建议使用import&#xff1f; import 属于 CSS&#xff0c;所以导入语句应写在 CSS 中&#xff0c;要注意的是导入语句应写在样式表的开头&#xff0c;否则无法正确导入外部文件&#xff1b;import 是 CSS2.1 才出现的概念&#xff0c;所以如果浏览器版…

javaWeb项目部署至tomcat下classes文件夹没有内容

解决方法&#xff1a;项目右键------Java Build Path----------Source 将Default output folder改成/src/main/webapp/WEB-INF/classes就可以了&#xff01;

第二次考核

https://gitee.com/sfr123/the_second_assessment/tree/master/SFR 7-1 学生类-构造函数 定义一个有关学生的Student类&#xff0c;内含类成员变量&#xff1a; String name、String sex、int age&#xff0c;所有的变量必须为私有(private)。 1.编写有参构造函数&#xff1a;…

[css] 写一个动画,向上匀速移动100px,向下以1.5倍速度移动200px,一直反复循环

[css] 写一个动画&#xff0c;向上匀速移动100px&#xff0c;向下以1.5倍速度移动200px&#xff0c;一直反复循环 .animation-block {width: 50px;height: 50px;background: red;margin-top: 200px;animation: up 1s linear, down 1.5s linear 1s;}keyframes up {0% {transform…

eclipse Maven项目发布到Tomcat下classes文件夹却没有子模块的编译类

解决方法&#xff1a; 1&#xff0c;在主项目上右键--Properties--Java Build Path 2&#xff0c;点击Link Source 3 , 点击Browse选择子项目的target----classes文件夹----点击确定 4 , 然后直接点击finish 5 , 在重新发布一下&#xff0c;再进去看WEB-INF下classes文件夹…

windows系统停止8080端口

1、首先查找到占用8080端口的进程号PID是多少 CMD>netstat -ano | findstr 8080 这个命令输出的最后一列表示占用8080端口的进程号是多少&#xff0c;假设为1234 2、kill掉这个进程 CMD>taskkill /F /PID 1234 参考地址&#xff1a;http://blog.csdn.net/zhengbo0/articl…

[css] 说出至少十条你理解的css规范

[css] 说出至少十条你理解的css规范 命名规范&#xff08;连字符-分隔的字符串&#xff09;文件宽度限制&#xff08;每行80个字符&#xff09;加注释编写选择器应有助于重用尽量不要加 !important避免使用CSS表达式选择<link> 舍弃 import避免使用滤镜&#xff08;IE 专…

马昕璐201771010118《面向对象程序设计(java)》第七周学习总结

第一部分&#xff1a;理论知识学习部分 Java用于控制可见性的4个访问权限修饰符&#xff1a; 1.private&#xff08;只有该类可以访问&#xff09; 2.protected&#xff08;该类及其子类的成员可以访问&#xff0c;同一个包中的类也可访问&#xff09; 3.public&#xff08;该类…

[css] 使用css画出一个五角星

[css] 使用css画出一个五角星 #star-five {margin: 50px 0;position: absolute;display: block;color: red;width: 0;height: 0;border-right: 100px solid transparent;border-bottom: 70px solid red;border-left: 100px solid transparent;transform: rotate(35deg);left: …

windows系统安装redis

第一步&#xff1a;进入 https://github.com/ServiceStack/redis-windows 进行下载安装包下载地址&#xff1a;https://github.com/MSOpenTech/redis/releases 这里提供windows的版本 3.0.501 可视化软件&#xff1a;http://www.oschina.net/news/55634/redisclient-2-0第二步&…

青蛙跳台阶算法

一、问题描述&#xff1a;一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共需要多少种跳法。 思路&#xff1a;首先考虑n等于0、1、2时的特殊情况&#xff0c;f(0) 0 f(1) 1 f(2) 2 其次&#xff0c;当n3时&#xff0c;青蛙的第一跳…

[css] 请说下你对css对象模型(CSSOM)的理解

[css] 请说下你对css对象模型(CSSOM)的理解 CSSOM 是一组允许 JavaScript 操作 CSS 的 API。它非常类似于 DOM&#xff0c;但是用于 CSS 而不是 HTML。它允许用户动态读取和修改 CSS 样式。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0…

HSSFCellStyle.ALIGN_CENTER报错

HSSFCellStyle.ALIGN_CENTER报错&#xff0c;是因为版本问题 将 hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); 修改为&#xff1a;hssfCellStyle.setAlignment(HorizontalAlignment.CENTER);

linux 查看磁盘空间大小

Ubuntu 查看磁盘空间大小命令 df -h Df命令是linux系统以磁盘分区为单位查看文件系统&#xff0c;可以加上参数查看磁盘剩余空间信息&#xff0c;命令格式&#xff1a; df -hl 显示格式为&#xff1a; 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% M…

[css] 使用overflow: scroll时不能平滑滚动怎样解决?

[css] 使用overflow: scroll时不能平滑滚动怎样解决&#xff1f; scroll-behavior: smooth;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

POI导出EXCEL设置高度和宽度

-------------------------------------------------------------------------------SSFRow hssfRow sheet.createRow(0);//创建表头hssfRow.setHeight((short)1000); //设置行高 sheet.setColumnWidth(列的下标, 256*30); //设置某一列宽度POI导出EXCEL设置跨行跨列&#xff…

[css] 用css实现倒影的效果

[css] 用css实现倒影的效果 box-reflect个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

router+x

vue-router官方的路由管理器 包含的功能&#xff1a; ——绑定方法进行跳转 路由嵌套 写的不一样搜索的路由路径也不一样 二级路由 设置默认路由 导航守卫&#xff1a; 用于强制跳转或者取消的方式守卫导航。 例如&#xff1a;未登录页面的时候&#xff0c;不允许用户跳转到其他…

mybatis查询返回空,SQL数据库执行有数据!

我的数据库为Oracle&#xff0c;可以插入&#xff0c;更新&#xff0c;但在在Mybatis中执行SQL查询返回的数据发现返回NULL&#xff0c;但是生成SQL放在数据库中查询是有数据的&#xff0c;并且SQL是正确的&#xff01; 这是没有改动的XML: <select id"findAllByParen…