线段树 poj 1436
题目大意:给出n条垂直于x轴的线段的数据y1,y2,x,求出有几个三条线段一组的三元组并且他们兩兩能相见的。
思路:对y轴建树,将x排序,然后按顺序边询问边擦入,用mark[i][j]表示j往左可以看到i。最后用一个三重循环计算答案。
但是注意:0,4,1 和 0,2,2 和 3,4,2这三条线段覆盖的结果是区间0~4通过线段树查找可见线段是两条,其实是3条(2~3可见另一条)
这里可以将y轴×2表示。这样就能解决这样的问题
0 1 2 3 4 2~3被覆盖 所以乘2解决
#include<stdio.h>
#include<string.h>
#include<algorithm> using namespace std; #define MAXN 16005
struct node
{
int l,r,w;
}x[MAXN<<];
struct abc
{
int y1,y2,x;
}z[MAXN];
bool m1[MAXN/][MAXN/];
bool cmp(abc a,abc b)
{
return a.x<b.x;
}
void push_down(int a)
{
x[a<<].w=x[a<<|].w=x[a].w;
x[a].w=-;
} void Build(int l,int r,int a)
{
x[a].l=l;
x[a].r=r;
x[a].w=-;
if(l==r)
return ;
int mid=(l+r)>>;
Build(l,mid,a<<);
Build(mid+,r,a<<|);
}
void Insert(int l,int r,int i,int a)
{
if(z[i].y1<=l&&r<=z[i].y2)
{
x[a].w=i;
return ;
}
if(l==r)
return ;
if(x[a].w!=-)
push_down(a);
int mid=(l+r)>>;
if(z[i].y1<=mid)
Insert(l,mid,i,a<<);
if(z[i].y2>mid)
Insert(mid+,r,i,a<<|);
}
void Ques(int l,int r,int i,int a)
{
if(x[a].w!=-)
{
m1[x[a].w][i]=;
return ;
}
if(l==r)
return ;
if(x[a].w!=-)
push_down(a);
int mid=(l+r)>>;
if(z[i].y1<=mid)
Ques(l,mid,i,a<<);
if(z[i].y2>mid)
Ques(mid+,r,i,a<<|);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
memset(m1,,sizeof(m1)); for(int i=;i<=n;i++)
{
scanf("%d%d%d",&z[i].y1,&z[i].y2,&z[i].x);
z[i].y1<<=;
z[i].y2<<=;
}
Build(,MAXN,);
sort(z+,z+n+,cmp);
for(int i=;i<=n;i++)
{
Ques(,MAXN,i,);
Insert(,MAXN,i,);
}
int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(m1[i][j])
for(int k=;k<=n;k++)
if(m1[i][k]&&m1[j][k])
ans++;
printf("%d\n",ans);
}
return ;
}
线段树 poj 1436的更多相关文章
- 离散化+线段树 POJ 3277 City Horizon
POJ 3277 City Horizon Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18466 Accepted: 507 ...
- [RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...
- 线段树 poj 3468
Description You have N integers, A1, A2, ... ,AN. You need to deal with two kinds of operations. One ...
- 线段树 poj 3667
1-n线段 m个操作 1 a 是否可找到连续a个空位子 有输出最左边(然后使这一段被占)没有0 2 a ,b a~b区间变成未使用 #include<stdio.h> #include& ...
- 线段树 poj 2991
我们只要把这些向量求和,最终所指的位置就是终点,因此我们只要维护好向量的区间和就可以了.对于第二个问题,我们可以用一个数组degree[i]表示第i个向量和第i-1一个向量当前的夹角,这样就有了当前的 ...
- POJ 1436 Horizontally Visible Segments(线段树)
POJ 1436 Horizontally Visible Segments 题目链接 线段树处理染色问题,把线段排序.从左往右扫描处理出每一个线段能看到的右边的线段,然后利用bitset维护枚举两个 ...
- POJ 1436 (线段树 区间染色) Horizontally Visible Segments
这道题做了快两天了.首先就是按照这些竖直线段的横坐标进行从左到右排序. 将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖. 对于一条线段来说,先查询和它能相连的所有线段,并加 ...
- poj 1436 线段树
题意:给你N条线段(垂直于x轴)的两个y坐标还有x坐标,问相互看到的三元组有多少个.有点纠结就是,如果两个连线之间正好有一条线段的某个端点,这个也是不能计算的,所以这个端点就有意义了,所以就用上面那个 ...
- POJ 1436 Horizontally Visible Segments (线段树·区间染色)
题意 在坐标系中有n条平行于y轴的线段 当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见 先把全部线段存下来 并按x ...
随机推荐
- elasticsearch GIS空间查询问题解决
在GIS行业的应用越来越广泛,GIS最常用根据区域进行空间数据查询 我定义了两个方法,一起来看一下: /** * geodistance filter * 一个过滤器来过滤基于一个特定的距离从 ...
- 《ARC以及非ARC的讨论》
ARC的机制是什么?它在那里放入retain/release函数调用? 请停止思考这些问题,把更多的精力放在下面的问题上,比如你的程序逻辑,对象的强,弱引用,对象的所属关系,可能的循环引用等问题上. ...
- 【代码笔记】iOS-网络嗅探
一,效果图. 二,工程图. 三,代码. AppDelegate.h #import <UIKit/UIKit.h> #import "Reachability.h" @ ...
- iOS流行的开源代码库
本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...
- OC 单例模式
OC 单例模式 概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约 ...
- 解决Jenkins 2.0 初始化界面卡住的问题
***************************************** *原创博客转载请注明出处,谢谢!* **************************************** ...
- ORA-19563: header validation failed for file
在测试服务器还原数据库时遇到了ORA-19563错误.如下所示 RMAN-00571: ======================================================== ...
- 在AndroidStudio v1.2.0中导入或增加新项目或工程(导入第三方类库或工程)
以下说明基于AndroidStdudio版本v1.2 由于AndroidStudio项目止录与Eclipse中的Worksapce在意义上的改变,所以导入新包或建立新项目时并不和以前那样了. 下面是我 ...
- JavaScript根据文件名判断文件类型
//JavaScript根据文件名判断文件类型 var imgExt = new Array(".png",".jpg",".jpeg",& ...
- Ubuntu nginx 配置404错误页面
1.创建自己的404.html页面: 2.更改nginx.conf在http定义区域加入: /etc/nginx# vim nginx.conf 下添加 fastcgi_intercept_error ...