POJ 1436 Horizontally Visible Segments
题意:
有一些平行于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的更多相关文章
- POJ 1436 Horizontally Visible Segments(线段树)
POJ 1436 Horizontally Visible Segments 题目链接 线段树处理染色问题,把线段排序.从左往右扫描处理出每一个线段能看到的右边的线段,然后利用bitset维护枚举两个 ...
- POJ 1436 Horizontally Visible Segments (线段树·区间染色)
题意 在坐标系中有n条平行于y轴的线段 当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见 先把全部线段存下来 并按x ...
- (中等) POJ 1436 Horizontally Visible Segments , 线段树+区间更新。
Description There is a number of disjoint vertical line segments in the plane. We say that two segme ...
- POJ 1436.Horizontally Visible Segments-线段树(区间更新、端点放大2倍)
水博客,水一水. Horizontally Visible Segments Time Limit: 5000MS Memory Limit: 65536K Total Submissions: ...
- poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)
ZOJ :: Problems :: Show Problem 1436 -- Horizontally Visible Segments 用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能 ...
- 【37%】【poj1436】Horizontally Visible Segments
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5200 Accepted: 1903 Description There ...
- POJ 1436 (线段树 区间染色) Horizontally Visible Segments
这道题做了快两天了.首先就是按照这些竖直线段的横坐标进行从左到右排序. 将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖. 对于一条线段来说,先查询和它能相连的所有线段,并加 ...
- 【解题报告】pojP1436 Horizontally Visible Segments
http://poj.org/problem?id=1436 题目大意:有n条平行于x轴的线段,每条线段有y坐标,如果两条线段有一段x坐标数值相等,且中间没有其它线段阻隔,则称这两条线段"照 ...
- poj1436 Horizontally Visible Segments
这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见 ...
随机推荐
- JQuery Ajax 的简单使用
简单判断用户名存在不存在,如果数据库存在此用户名,提示不能注册 前台代码如下: <!DOCTYPE html> <html lang="en"> <h ...
- Android activity四种基本启动模式
standard:默认的模式,每次启动会新创建一个activity对象 singleTop:在当前任务栈中,判断栈顶是否为当前的activity,如果是,就直接使用,如果不是,就会创建新的activi ...
- Java源码初学_LinkedList
一.LinkedList的内部数据结构 LinkedList底层是一个链表的数据结构,采用的是双向链表,基本的Node数据结构代码如下: private static class Node<E& ...
- linux 多线程信号处理总结
linux 多线程信号总结(一) 1. 在多线程环境下,产生的信号是传递给整个进程的,一般而言,所有线程都有机会收到这个信号,进程在收到信号的的线程上下文执行信号处理函数,具体是哪个线程执行的难以获知 ...
- 使用Ant打包工具 基本介绍
由于使用java,javac,jar等工具进行编译打包,即繁琐低效又容易出错,因此Ant出现了. Ant的出现就是专门为了打包编译java代码的,使用之前得稍微学一下.Ant的运行起来主要是依靠配置文 ...
- swift语言学习之UITableView分割线左边到头的解决
此方法兼容ios 7.8.9 // 在tableView创建地方设置 if tableView!.respondsToSelector("setSeparatorInset:") ...
- 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...
- Oracle SQL 调优之 sqlhc
SQL 执行慢,如何 快速准确的优化. sqlhc 就是其中最好工具之一 通过获得sql所有的执行计划,列出实际的性能的瓶颈点,列出 sql 所在的表上的行数,每一列的数据和分布,现有的索引,sql ...
- easyui datagrid 设置列宽
<script> $(document).ready(function () { alert("sdf"); ...
- armp启动
1.启动apahcehttpd.exe -k starthttpd.exe -k restart 重启httpd.exe -k install 安装 2.php启动apache.conf文件添加:Lo ...