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]区间和前面区间的”可见 ...
随机推荐
- access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")
在开启derby服务出现该错误(测试hibernate 连接数据库时 使用myeclipse2014自带的数据库--windows->show view->other->Myecl ...
- (六)ARM状态寄存器-PSR
ARM程序状态寄存器Program State Register 在ARM模式中, 有16个数据寄存器和1或2个状态寄存器是可以随时访问的.在特权模式 (privileged mode) 下, 对应的 ...
- java语法糖3 深入剖析Java中的装箱和拆箱
装箱 在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new Integer(10); 而在从Java SE5开始就提供了自动装箱的特性, ...
- Multipath多路径冗余全解
一.什么是multipath 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,由于主机和存储通过了光纤交换机连接,这样的话,就构成了多对多的关系.也就是说 ...
- samba服务器搭建
为实现windows与linux资源共享,搭建一个samba服务器:这个我也是探索了一段时间. 找到一篇写得比较清楚的博客: http://yangxuejun.blog.51cto.com/6239 ...
- nginx的启动与关闭
[root@nginx ~]# #默认启动方式 [root@nginx ~]# which nginx /sbin/nginx [root@nginx ~]# nginx [root@nginx ~] ...
- import package的问题
在新建class的时候除了名字还可以选择包名: 新建2个包名,然后在不同的包里写2个同名的类, 程序中导入另外一个包 package com.hs;import com.hy.Father; 当直接使 ...
- Selenium解决页面元素不在视野范围内的问题
当需要使用滚动条才能使页面元素显示在视野范围内时,必须用代码处理下,才能对其进行操作. 处理其实也很简单,就是调用JS函数. driver.executeScript("arguments[ ...
- VC++NMAKE
目录 第1章 NMAKE 1 1.1 运行NMAKE 1 1.1.1 NMAKE的实质 2 1.2 描述块 3 1.2.1 定义 3 1.2.2 多个描述块 3 1 ...
- java 内部类3(匿名内部类)
匿名内部类: 1.没有类名的类就叫匿名内部类 2.好处:简化书写. 3.使用前提:必须有继承或实现关系......不要想着你自己没有钱你没可是你爸有 4.一般用于于实参.(重点) class Oute ...