poj1436 Horizontally Visible Segments
这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见“情况时,由于[1,2],[2,3]将2,3端点覆盖,最终得不到[1,5]和区间[1,4]”可见“的情况,而实际上两者的[2,3]区间是可以存在一条水平线将其直接相连的。接下来将要更新的区间按照x从小到大排序,然后依次查询,查询之后再更新就行。
这样可以得到一个描述各个区间的相互关系的图G[N],G[i]存储的是在区间i右边的”可见“的区间,最后暴力统计一下,就可以解决问题了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define M (1<<15)
#define maxn 16000
#define N 8001 using namespace std; typedef struct
{
int x,s,e;
} Seg; Seg seg[N];
int color[M],Hash[N];/*color[rt]为-1表示区间没有完全覆盖,0和其他整数表示被相应的sticks完全覆盖,*/
int n; vector<int>G[N]; int cmp(Seg a,Seg b)
{
return a.x<b.x;
} void PushDown(int rt)
{
if(color[rt]!=-)
{
color[rt<<]=color[rt<<|]=color[rt];
color[rt]=-;
}
} void update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
color[rt]=c;
return;
}
PushDown(rt);
int m=(l+r)>>;
if(L<=m)
update(L,R,c,lson);
if(R>m)
update(L,R,c,rson);
} void query(int L,int R,int c,int l,int r,int rt)
{
if(color[rt]!=-)
{
if(Hash[color[rt]]!=color[rt])
{
Hash[color[rt]]=color[rt];
G[color[rt]].push_back(c);
}
return;
}
int m=(l+r)>>;
if(L<=m)
query(L,R,c,lson);
if(R>m)
query(L,R,c,rson);
} int main()
{
int tc;
scanf("%d",&tc);
while(tc--)
{
memset(color,,sizeof(color));
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d%d%d",&seg[i].s,&seg[i].e,&seg[i].x);
seg[i].s<<=;
seg[i].e<<=;
G[i].clear();
}
sort(seg+,seg+n+,cmp);
for(int i=; i<=n; i++)
{
memset(Hash,,sizeof(Hash));
int l=seg[i].s;
int r=seg[i].e;
query(l,r,i,,maxn,);
update(l,r,i,,maxn,);
}
int cnt=;
for(int i=; i<=n; i++)
{
for(int j=; j<G[i].size(); j++)
{
int k=G[i][j];
for(int x=; x<G[i].size(); x++)
for(int w=; w<G[k].size(); w++)
if(G[k][w]==G[i][x])
cnt++;
}
}
printf("%d\n",cnt);
}
return ;
}
poj1436 Horizontally Visible Segments的更多相关文章
- POJ 1436 Horizontally Visible Segments (线段树·区间染色)
题意 在坐标系中有n条平行于y轴的线段 当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交 就视为它们是可见的 问有多少组三条线段两两相互可见 先把全部线段存下来 并按x ...
- POJ 1436 Horizontally Visible Segments(线段树)
POJ 1436 Horizontally Visible Segments 题目链接 线段树处理染色问题,把线段排序.从左往右扫描处理出每一个线段能看到的右边的线段,然后利用bitset维护枚举两个 ...
- 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 , 线段树+区间更新。
Description There is a number of disjoint vertical line segments in the plane. We say that two segme ...
- POJ 1436 Horizontally Visible Segments
题意: 有一些平行于y轴的线段 ,两条线段称为互相可见当且仅当存在一条水平线段连接这两条 与其他线段没交点. 最后问有多少组 3条线段,他们两两是可见的. 思路: 线段树,找出两两可见的那些组合, ...
- POJ 1436 (线段树 区间染色) Horizontally Visible Segments
这道题做了快两天了.首先就是按照这些竖直线段的横坐标进行从左到右排序. 将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖. 对于一条线段来说,先查询和它能相连的所有线段,并加 ...
- 【解题报告】pojP1436 Horizontally Visible Segments
http://poj.org/problem?id=1436 题目大意:有n条平行于x轴的线段,每条线段有y坐标,如果两条线段有一段x坐标数值相等,且中间没有其它线段阻隔,则称这两条线段"照 ...
- POJ 1436.Horizontally Visible Segments-线段树(区间更新、端点放大2倍)
水博客,水一水. Horizontally Visible Segments Time Limit: 5000MS Memory Limit: 65536K Total Submissions: ...
随机推荐
- R-大数据分析挖掘(2-R爬虫)
RCurl作者:
- java 用eclipse j2ee写的servlet 程序,WEB-INF下的配置文件web.xml在哪啊?谢谢!
我用的版本是tomcat7.0,在webcontent\web-inf里只有一个空文件夹lib,写完servlet 类程序,就可以运行了,我想知道自动生成的配置文件在哪里?或者说从哪里能够看出来配置内 ...
- ActionBar功能,效果图一览
这里提供了效果预览,如果由你需要的界面,详细的代码可以去看原文. http://blog.csdn.net/android2me/article/details/8874846 一.概述 1.App ...
- nyoj349 poj1094 Sorting It All Out(拓扑排序)
nyoj349 http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094 http://poj.org/problem?id=10 ...
- iOS开发——免证书调试(Xcode7,iOS9)
(资料已做好,待整理成文章……)
- (poj)3414 Pots (输出路径的广搜)
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- 在Windows下用gSoap实现简单加法实例
实现一个简单的a+b程序,在服务器端写一个程序,里面包含了a+b的函数,然后通过客户端代码向其发送两个数字,在服务器运算得到结果返回给客户端显示出来. 1.在gSoap的官网上下载文件夹,本人的版本是 ...
- Hash函数的安全性
我们为了保证消息的完整性,引进了散列函数,那么散列函数会对安全正造成什么影响呢?这是需要好好研究一番的问题. 三个概念: 1.如果y<>x,且h(x)=h(y),则称为碰撞. 2.对于给定 ...
- MasterCard信用卡测试卡号-creditcard-1
MasterCard信用卡测试卡号-creditcard-1 510510510510510051111111111111185454545454545454550000000000000455555 ...
- IBUS-WARNING **: Process Key Event failed: Timeout was reached
在gvim中ibus敲字时,偶尔会在n秒之后才显示到屏幕,反应死慢.控制台会看到下面的错误信息. (gvim:): IBUS-WARNING **: Process Key Event failed: ...