题意:

有一些平行于y轴的线段 ,两条线段称为互相可见当且仅当存在一条水平线段连接这两条  与其他线段没交点。 最后问有多少组  3条线段,他们两两是可见的。

思路:

线段树,找出两两可见的那些组合,最后暴力判断。

#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<vector>
#define debug(x) printf(#x"= %d \n",x);
#define N 20000
using namespace std;
int id[N*];
vector<int>e[N];
void build(int l,int r,int i)
{
id[i]=;
if(l!=r)
{
int mid=(l+r)>>;
build(l,mid,i<<);
build(mid+,r,i<<|);
}
}
void pushdown(int i)
{
if(id[i]!=-)
{
id[i<<]=id[i<<|]=id[i];
id[i]=-;
}
}
void update(int l,int r,int pl,int pr,int va,int i)
{
if(l>=pl&&r<=pr)
{
if(id[i]!=-)
{
e[id[i]].push_back(va);
id[i]=va;
return;
}
id[i]=va;
}
if(id[i]!=va)
pushdown(i);
int mid=(l+r)>>;
if(pl<=mid)update(l,mid,pl,pr,va,i<<);
if(pr>mid)update(mid+,r,pl,pr,va,i<<|);
}
struct node
{
int y1,y2,x;
}s[];
bool cmp(node a,node b)
{
return a.x<b.x;
}
int cas[N];
int main() {
int tt,n,ri=;
memset(cas,,sizeof(cas));
scanf("%d",&tt);
while(tt--)
{
int maxn=;
build(,maxn,);
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%d%d%d",&s[i].y1,&s[i].y2,&s[i].x);
s[i].y1++;
s[i].y2++;
s[i].y1=s[i].y1*-;
s[i].y2=s[i].y2*-;
}
sort(s+,s+n+,cmp);
for(int i=;i<=n;++i)e[i].clear();
for(int i=;i<=n;++i)
{
int l,r;
l=s[i].y1;
r=s[i].y2;
update(,maxn,l,r,i,);
}
for(int i=;i<=n;++i)
{
sort(e[i].begin(),e[i].end());
e[i].erase(unique(e[i].begin(),e[i].end()),e[i].end());//去重
}
int ans=;
for(int i=;i<=n;++i)
{
ri++;
for(int j=;j<e[i].size();++j)
cas[e[i][j]]=ri;
for(int j=;j<e[i].size();++j)
{
int now=e[i][j];
for(int k=;k<e[now].size();++k)
{
if(cas[e[now][k]]==ri)
{
// printf("%d %d %d\n",i,now,e[now][k]);
ans++;
}
}
}
}
printf("%d\n",ans);
}
return ;
}

POJ 1436 Horizontally Visible Segments的更多相关文章

  1. POJ 1436 Horizontally Visible Segments(线段树)

    POJ 1436 Horizontally Visible Segments 题目链接 线段树处理染色问题,把线段排序.从左往右扫描处理出每一个线段能看到的右边的线段,然后利用bitset维护枚举两个 ...

  2. POJ 1436 Horizontally Visible Segments (线段树&#183;区间染色)

    题意   在坐标系中有n条平行于y轴的线段  当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交  就视为它们是可见的  问有多少组三条线段两两相互可见 先把全部线段存下来  并按x ...

  3. (中等) POJ 1436 Horizontally Visible Segments , 线段树+区间更新。

    Description There is a number of disjoint vertical line segments in the plane. We say that two segme ...

  4. POJ 1436.Horizontally Visible Segments-线段树(区间更新、端点放大2倍)

    水博客,水一水. Horizontally Visible Segments Time Limit: 5000MS   Memory Limit: 65536K Total Submissions:  ...

  5. poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)

    ZOJ :: Problems :: Show Problem 1436 -- Horizontally Visible Segments 用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能 ...

  6. 【37%】【poj1436】Horizontally Visible Segments

    Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5200   Accepted: 1903 Description There ...

  7. POJ 1436 (线段树 区间染色) Horizontally Visible Segments

    这道题做了快两天了.首先就是按照这些竖直线段的横坐标进行从左到右排序. 将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖. 对于一条线段来说,先查询和它能相连的所有线段,并加 ...

  8. 【解题报告】pojP1436 Horizontally Visible Segments

    http://poj.org/problem?id=1436 题目大意:有n条平行于x轴的线段,每条线段有y坐标,如果两条线段有一段x坐标数值相等,且中间没有其它线段阻隔,则称这两条线段"照 ...

  9. poj1436 Horizontally Visible Segments

    这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见 ...

随机推荐

  1. (一)MII/MDIO接口详解

    本文主要分析MII/RMII/SMII,以及GMII/RGMII/SGMII接口的信号定义,及相关知识,同时本文也对RJ-45接口进行了总结,分析了在10/100模式下和1000M模式下的设计方法. ...

  2. TortoiseGIT

    TortoiseGIT 是Git版本控制系统的一个免费开源客户端,它是git版本控制的 Windows 扩展.可以使你避免使用枯燥而且不方便的命令行.它完全嵌入 Windows Explorer,使用 ...

  3. Linux内核态用户态相关知识

    http://www.cnblogs.com/bakari/p/5520860.html http://www.cnblogs.com/Anker/p/3269106.html

  4. 转:c++内存分配

    第一篇: http://my.oschina.net/pollybl1255/blog/140323 BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS ...

  5. TP学习笔记

    ThinkPHP采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从URL参数中解析当前请求的模块.控制器和操作,下面是一个标准的URL访问格式: http://serverNa ...

  6. commonJS — 通用方法(for COM)

    for COM github: https://github.com/laixiangran/commonJS/blob/master/src/forCOM.js 代码 /** * Created b ...

  7. 网页上记录鼠标的点击次数和一段有用的php代码,自己学习使用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 应用 Middleware

    主要应用场景:过滤HTTP请求 laravel本身自带了几个Middleware在app/http/middleware目录下面 然后在app/http/kernel.php中注册 自定义一个midd ...

  9. Android FloatingActionButton(FAB) 悬浮按钮

    FloatingActionButton 悬浮按钮                                                                            ...

  10. NCrawler 学习

    NCrawler是一款国外的开源网络爬虫软件,遵循LGPL许可协议.其HTML处理使用的是htmlagilitypack开源库,采用xpath的方式处理定位网页元素,十分方便.同时其采用HttpWeb ...