POJ2528 计算可见线段(线段树)
原题链接: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 计算可见线段(线段树)相关推荐
- poj2528贴海报(线段树离散化)
//poj2528贴海报(线段树离散化) #include<cstring> #include<iostream> #include<cstdio> #includ ...
- 线段(向量)的计算(判断线段重叠、相交,合并线段,点与线的关系)
主要内容: 判断两线段是否相交 计算两线段的交叉点 点与直线的位置关系 判断两线段重合并计算其重合部分 判断合并两条线段 说明全都在注释里了,有的方法可能不是最佳,欢迎大家提出建议~~ public ...
- wpl计算方法_【数据结构】树的应用-计算哈夫曼树的WPL值
计算哈夫曼树的WPL值 根据给定的n个权值(非负值),计算所构造哈夫曼树的WPL值. 基本要求: (1)根据给定的数据,建立哈夫曼树: (2)输出每个叶子结点的带权路径长度: (3)输出哈夫曼树的WP ...
- POJ-2528 Mayor's posters 线段树+离散化 或 DFS
题目大意 有 t 组数据,每组有 n 张(1<=n<=1e4)覆盖了 区间 [li,ri] 的海报(1<=i<=n,1<=li<=ri<=1e7),海报会由于 ...
- 【bzoj4881】[Lydsy2017年5月月赛]线段游戏 树状数组+STL-set
题目描述 quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1,p_i),其中p_1,p_2,...,p_n构成 ...
- 向量法计算空间点到线段的距离(python)
中学数学告诉我们,计算点到线段的距离有两种. 我们假设点是P,线段是AB.P和AB都由三维的笛卡尔坐标表示.现计算P到AB的距离. 第一种是,过点P向线段AB上画垂线,判断垂足有没有落在线段上.如果落 ...
- 计算点到直线/线段的距离
计算目标点到直线/线段的距离,先计算直线/线段上距离目标点最近的点,目标点与最近点的距离,即目标点到直线/线段的距离. 计算最近点: //点到直线的最近点public void GetNear ...
- 【长度统计】多个对象长度计算,支持线段、多段线、圆弧
长度统计zcd插件 支持线段.多段线.圆弧.圆.椭圆等长度计算 使用方法 1.下载插件到电脑任意位置 2.打开CAD输入命令AP(或菜单栏--工具--加载程序) 3.找到下载的插件统计线段长度zcd. ...
- bzoj 4765: 普通计算姬(分块+树状数组)
4765: 普通计算姬 Time Limit: 30 Sec Memory Limit: 256 MB Submit: 1481 Solved: 318 [Submit][Status][Disc ...
最新文章
- python判断密码是否正确_第一个python程序-判断登陆用户名和密码是否正确
- Segment Routing — SR-MPLS
- 在python中查看关键字、需要执行_python关键字以及含义,用法
- 洛谷P4292:重建计划(点分治、单调队列)
- P4383-[八省联考2018]林克卡特树【wqs二分,树形dp】
- 制作alipay-sdk-java包到本地仓库
- Bootstrap--导航栏样式编辑
- 服务器网站管理页面打不开解决方法
- 手动为容器设置ip地址
- Angr安装与使用之使用篇(十四)
- RGB_LED,WS2811彩带驱动设计
- 怎么用虚拟服务器多开yy号,YY盒子多开器怎么用?歪歪语音多开器使用教程图文详解(图文)...
- 移动端:苹果开发者账号Apple Developer Program
- 计算机专业术语大全,计算机专业名词总汇,计算机专业名词总汇
- stable-baselines3学习之Logger
- 计算商品过期具体时间
- 微服务门神-Zuul
- 【全栈之前端练习】ES6核心编程
- Win7 架设git服务器
- 视频教程-2021软考系统集成项目管理工程师视频教程精讲 基础知识(下)-软考