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/ 今晚上比赛就考到了 排兵布阵啊,难受. [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时 ...
随机推荐
- 学习web前端的roadmap
- SpringCloud之整合Feign
假设提供者有如下服务接口方法 @RestController @RequestMapping("/person") public class PersonController { ...
- DefaultSingletonBeanRegistry源码解析
DefaultSingletonBeanRegistry是SingletionBean注册器的默认实现. 来学习下DefaultSingletonBeanRegistry的源码: package or ...
- 我想solo自己一个人!
区域赛之后你就该走了,现在你告诉我,没精力不打了,我真谢谢你! 今年就TM的没有一点舒心的地方! 父母分居, 队友出走, 队伍解散, 白天家里两个外甥很吵, 鼻窦炎复发, 喜欢的妹子也追不到, 整夜失 ...
- P1457 城堡 The Castle 位运算+BFS+思维(难题,好题)
题目描述 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物:一张"幸运爱尔兰"(一种彩票).结果这张彩票让他获得了这次 ...
- CodeForces - 1245F Daniel and Spring Cleaning (数位DP)
While doing some spring cleaning, Daniel found an old calculator that he loves so much. However, it ...
- 图论--网络流--最大流 HDU 3572 Task Schedule(限流建图,超级源汇)
Problem Description Our geometry princess XMM has stoped her study in computational geometry to conc ...
- POJ 1330 Nearest Common Ancestors(裸LCA)
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39596 Accept ...
- python进程/线程/协程
一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...
- xml出现Exception in thread "main" java.lang.NullPointerException
运行代码出现Exception in thread "main" java.lang.NullPointerException 可以看下这个链接:https://ask.csdn. ...