POJ1436
题目链接:https://vjudge.net/problem/POJ-1436
解题思路:基于y轴建立线段树。

如图是根据样例画出的图。下面都以题目样例为例。
但是,如果仅仅以给出的y1, y2为边界的话会出现线段的最右点被当成一小段线段的问题,样例中的x=4的线段和x=1的线段会被判定“不可见”。为了方便处理边界情况,我们把y1和y2都乘2再存入线段树中,这也是用线段树解决问题的时候常用的处理边界争议的方法。
在每次存入线段的时候,先检查一下已有的线段树,看看以我们要存入的线段的端点[y1,y2]为边界的线段上是否已有线段,如果有,以一个二维数组记录起来。最后以几个for循环来得出ans。
注意:用bool型代替int型可节省很多空间。一开始那个link[ ][ ]数组我是用int型的,然后提交的时候一直MLE,后来看了网上的题解,知道了这个点,把int改成bool就AC了。
AC代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int y=8000*2;
const int maxn=8000+5;
int tree[y<<2];
bool link[maxn][maxn];
struct side{
int y1,y2,x;
bool operator <(const side &a)const{
return x<a.x;
}
}tmp[maxn];
void pushdown(int rt){
tree[rt<<1]=tree[rt<<1|1]=tree[rt];
tree[rt]=-1;
}
void build(int L,int R,int x,int l,int r,int rt){
if(L<=l&&r<=R){
tree[rt]=x;
return;
}
if(l==r) return;
if(tree[rt]!=-1)
pushdown(rt);
if(L<=(l+r)/2) build(L,R,x,l,(l+r)/2,rt<<1);
if((l+r)/2<R) build(L,R,x,(l+r)/2+1,r,rt<<1|1);
}
void query(int L,int R,int index,int l,int r,int rt){
if(tree[rt]!=-1){
link[tree[rt]][index]=true;
return;
}
if(l==r)
return;
if(L<=(l+r)/2) query(L,R,index,l,(l+r)/2,rt<<1);
if((l+r)/2<R) query(L,R,index,(l+r)/2+1,r,rt<<1|1);
}
int main(){
int n,ans;
int d,i,j;
scanf("%d",&d);
while(d--){
memset(tree,-1,sizeof(tree));
memset(link,false,sizeof(link));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d%d",&tmp[i].y1,&tmp[i].y2,&tmp[i].x);
sort(tmp,tmp+n);
for(i=0;i<n;i++){
query(tmp[i].y1*2,tmp[i].y2*2,i,0,y,1);
build(tmp[i].y1*2,tmp[i].y2*2,i,0,y,1);
}
ans=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++){
if(link[i][j]){
for(int k=i+1;k<j;k++){
if(link[i][k]&&link[k][j])
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
POJ1436的更多相关文章
- poj1436 Horizontally Visible Segments
这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见 ...
- poj1436水平可见线
还是线段树区间更新,这次不需要对线段离散化,但是要把线段纵坐标*2,可以举例模拟 #include<iostream> #include<cstring> #include&l ...
- 【37%】【poj1436】Horizontally Visible Segments
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5200 Accepted: 1903 Description There ...
- [转载]完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
- 【转】线段树完全版~by NotOnlySuccess
线段树完全版 ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...
- 《完全版线段树》——notonlysuccess
转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...
- 【转】 线段树完全版 ~by NotOnlySuccess
载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...
- 【转载】完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...
随机推荐
- Linux系统管理第三次作业 账号管理 权限及归属管理
1.创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) [root@localhost ~]# mkdir /guanli [root@localhos ...
- 项目Alpha冲刺 Day12
1)站立式会议: 2)今日安排: 项目演示. 3)项目情况 项目进展:系统已实现预期的所有的功能.问题困难:系统测试不够全面,主要做功能测试,对于非功能测试,如压力测试.效能测试.安全性等并未测试.心 ...
- Netty(一):ByteBuf读写过程图解
我们知道ByteBuf通过读写两个索引分离,避免了NIO中ByteBuffer中读写模式切换时,需要flip等繁琐的操作. 今天就通过一段测试代码以及图例来直观的了解下ByteBuf中的readInd ...
- Linux 搭建nginx的PID
pid logs/nginx.pid 安装的时候就是没有,其实在启动 nginx 时自动生成的 里面存放的是 当前 nginx 住进程的 ID 号:所以在配置文件中指定pidpid /usr/loca ...
- Spring LDAP的使用
LDAP入门http://www.jianshu.com/p/7e4d99f6baaf Spring LDAP,是Spring的一个组件,实现对LDAP的操作. 在编程操作MySQL时,我们除了用JD ...
- Xapian实战(三):索引
参考资料: Xapian:Document, Value和Term Xapian:Database Xapian机制简要介绍 1. Xapian中各类要点总结 @ Database Database ...
- 目标检测之yolo源码分析
三.配置文件详解(config.py) import os # 数据集路径,和模型检查点路径 # # path and dataset parameter # DATA_PATH = 'data' # ...
- three.js中的矩阵变换(模型视图投影变换)
目录 1. 概述 2. 基本变换 2.1. 矩阵运算 2.2. 模型变换矩阵 2.2.1. 平移矩阵 2.2.2. 旋转矩阵 2.2.2.1. 绕X轴旋转矩阵 2.2.2.2. 绕Y轴旋转矩阵 2.2 ...
- Linux常用的安全加固
一.账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险. 操作步骤userdel <用户名> //删除不必要的账号.passwd -l <用户名> //锁定 ...
- EChart将timeline图标设置为加号
一 要实现的效果 二 官方文档 看一下官方文档上,替换symbol的描述: timeline.symbol string [ default: 'emptyCircle' ] timeline标记的图 ...