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]区间和前面区间的”可见 ...
随机推荐
- js中event.keyCode用法及keyCode对照表
HTML 用户名:<input type="text" id="UserAccount" onKeyPress="JumpByEnter(Use ...
- JavaWeb 7 Servlet
7 Servlet Servlet学习的大纲:1. servlet概念及相关接口简介2. servet 执行过程3. servlet路径映射4. 缺省servlet --应用5. s ...
- active developer path ("") does not exist
pod update --verbose --no-repo-update 出现的错误. 解决:在终端中修改你的CommandLine Tools的位置: xcode-select -switch / ...
- composer 安装yii插件 fontawesome
国外站点 http://fontawesome.io/ 国内站点 http://fontawesome.dashgame.com/ Installation The preferred way to ...
- hibernate.properties和hibernate.cfg.xml
hibernate.properties和hibernate.cfg.xml 博客分类: 框架技术 HibernateXMLSQLOracleJDBC hibernate配置文件可以有两种方式 ...
- python中用filter求素数
#用filter求素数 #生成器,生成一个无限序列 def _odd_iter(): n=1 while True: n=n+2 yield n #筛选函数 def _not_divisible(n) ...
- 20160808_Shell书
1. http://item.jd.com/11075150.html 2.
- easyui dialog
<!--弹出“创建”窗口 --> <div id="dialog" class="easyui-dialog" title="创建机 ...
- js里面获取三位不重复值
<html><body> <script type="text/javascript"> var d = new Date();var sz = ...
- Windows7睡眠后自动唤醒
笔者的电脑(Windows7 64位旗舰版)睡眠后,隔段时间后会自动唤醒.经两项配置后,解决了该问题. 1 禁用唤醒定时器 控制面板里进入"电源选项""更改计划设置&qu ...