原题链接:POJ2528

解析:这题考察的是线段树子区间更新的维护中的计算可见线段。

用离散化,排序去重,但是这题广告是一块瓷砖一块瓷砖贴的,也就是说有可能离散化之后,明明俩个相邻点之前有空白,但是由于离散化分配序号是紧挨着的,就造成了俩块有广告瓷砖紧挨。举个例子,比如四号瓷砖(以下用号简称)和五号都有广告,那么离散化之后四号序号为1,五号为2,他们之间没别的位置,故全覆盖,那如果四号和六号有广告,但是五号没有,由于我们离散化记录的是广告左右边,故四号为1,六号为2,那么他们之间还是没空白,这就与题意不符了。所以当相邻边大于1时,序号要多+1。

代码实例:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 10100;
int x[4*maxn];
int id[10000010];
struct CPost{int l,r;bool vis;
}poster[maxn];
struct CNode{int l,r;bool bCovered;int Mid(){return (l+r)/2;}
}tree[1000000];
void BuildTree(int root,int l,int r){tree[root].l = l;tree[root].r = r;tree[root].bCovered = false;if(l == r)  return;BuildTree(2*root+1,l,(l+r)/2);BuildTree(2*root+2,(l+r)/2+1,r);
}
bool Push(int root,int s,int e){if(tree[root].bCovered) return false;if(s == tree[root].l && e == tree[root].r){tree[root].bCovered = true;return true;}bool res;if(e <= tree[root].Mid()) res = Push(2*root+1,s,e);else if(s > tree[root].Mid()) res = Push(2*root+2,s,e);else{bool r1 = Push(2*root+1,s,tree[root].Mid());bool r2 = Push(2*root+2,tree[root].Mid()+1,e);res = r1 || r2;}if(tree[2*root+1].bCovered && tree[2*root+2].bCovered)tree[root].bCovered = true;return res;
}int main()
{int t;scanf("%d",&t);while(t--){int n,cnt;scanf("%d",&n);for(int i = 0;i < n;i++){scanf("%d%d",&x[i],&x[i+n]);poster[i].l = x[i];poster[i].r = x[i+n];}sort(x,x+2*n);cnt = unique(x,x+2*n)-x;int interval = 1;for(int i = 0;i < cnt;i++){id[x[i]] = interval;if(i < cnt-1){if(x[i+1] - x[i] == 1) interval++;else interval += 2;}}BuildTree(0,1,interval);int ans = 0;for(int i = n-1;i >= 0;i--){int s = id[poster[i].l];int e = id[poster[i].r];if(Push(0,s,e)) ans++;}printf("%d\n",ans);} return 0;
} 

转载于:https://www.cnblogs.com/long98/p/10352196.html

POJ2528 计算可见线段(线段树)相关推荐

  1. poj2528贴海报(线段树离散化)

    //poj2528贴海报(线段树离散化) #include<cstring> #include<iostream> #include<cstdio> #includ ...

  2. 线段(向量)的计算(判断线段重叠、相交,合并线段,点与线的关系)

    主要内容: 判断两线段是否相交 计算两线段的交叉点 点与直线的位置关系 判断两线段重合并计算其重合部分 判断合并两条线段 说明全都在注释里了,有的方法可能不是最佳,欢迎大家提出建议~~ public ...

  3. wpl计算方法_【数据结构】树的应用-计算哈夫曼树的WPL值

    计算哈夫曼树的WPL值 根据给定的n个权值(非负值),计算所构造哈夫曼树的WPL值. 基本要求: (1)根据给定的数据,建立哈夫曼树: (2)输出每个叶子结点的带权路径长度: (3)输出哈夫曼树的WP ...

  4. POJ-2528 Mayor's posters 线段树+离散化 或 DFS

    题目大意 有 t 组数据,每组有 n 张(1<=n<=1e4)覆盖了 区间 [li,ri] 的海报(1<=i<=n,1<=li<=ri<=1e7),海报会由于 ...

  5. 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set

    题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...

  6. 向量法计算空间点到线段的距离(python)

    中学数学告诉我们,计算点到线段的距离有两种. 我们假设点是P,线段是AB.P和AB都由三维的笛卡尔坐标表示.现计算P到AB的距离. 第一种是,过点P向线段AB上画垂线,判断垂足有没有落在线段上.如果落 ...

  7. 计算点到直线/线段的距离

        计算目标点到直线/线段的距离,先计算直线/线段上距离目标点最近的点,目标点与最近点的距离,即目标点到直线/线段的距离. 计算最近点: //点到直线的最近点public void GetNear ...

  8. 【长度统计】多个对象长度计算,支持线段、多段线、圆弧

    长度统计zcd插件 支持线段.多段线.圆弧.圆.椭圆等长度计算 使用方法 1.下载插件到电脑任意位置 2.打开CAD输入命令AP(或菜单栏--工具--加载程序) 3.找到下载的插件统计线段长度zcd. ...

  9. bzoj 4765: 普通计算姬(分块+树状数组)

    4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 1481  Solved: 318 [Submit][Status][Disc ...

最新文章

  1. python判断密码是否正确_第一个python程序-判断登陆用户名和密码是否正确
  2. Segment Routing — SR-MPLS
  3. 在python中查看关键字、需要执行_python关键字以及含义,用法
  4. 洛谷P4292:重建计划(点分治、单调队列)
  5. P4383-[八省联考2018]林克卡特树【wqs二分,树形dp】
  6. 制作alipay-sdk-java包到本地仓库
  7. Bootstrap--导航栏样式编辑
  8. 服务器网站管理页面打不开解决方法
  9. 手动为容器设置ip地址
  10. Angr安装与使用之使用篇(十四)
  11. RGB_LED,WS2811彩带驱动设计
  12. 怎么用虚拟服务器多开yy号,YY盒子多开器怎么用?歪歪语音多开器使用教程图文详解(图文)...
  13. 移动端:苹果开发者账号Apple Developer Program
  14. 计算机专业术语大全,计算机专业名词总汇,计算机专业名词总汇
  15. stable-baselines3学习之Logger
  16. 计算商品过期具体时间
  17. 微服务门神-Zuul
  18. 【全栈之前端练习】ES6核心编程
  19. Win7 架设git服务器
  20. 视频教程-2021软考系统集成项目管理工程师视频教程精讲 基础知识(下)-软考

热门文章

  1. 如何去掉CodeIgniter URL中的index.php
  2. 使用Powershell 来创建新邮箱帐号
  3. 初识用.NET Remoting来开发分布式应用 (转载)
  4. SharePoint 2013 - Callout
  5. 软件架构阅读笔记15
  6. Java学习之路(七):泛型
  7. 今天你写控件了吗?----ASP.net控件开发系列(三)
  8. “无中生有”计算机视觉探奇
  9. CNN笔记:通俗理解卷积神经网络
  10. 图像处理之玻璃水印特效(祝大家圣诞节快乐)