这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有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的更多相关文章

  1. POJ 1436 Horizontally Visible Segments (线段树&#183;区间染色)

    题意   在坐标系中有n条平行于y轴的线段  当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交  就视为它们是可见的  问有多少组三条线段两两相互可见 先把全部线段存下来  并按x ...

  2. POJ 1436 Horizontally Visible Segments(线段树)

    POJ 1436 Horizontally Visible Segments 题目链接 线段树处理染色问题,把线段排序.从左往右扫描处理出每一个线段能看到的右边的线段,然后利用bitset维护枚举两个 ...

  3. poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)

    ZOJ :: Problems :: Show Problem 1436 -- Horizontally Visible Segments 用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能 ...

  4. 【37%】【poj1436】Horizontally Visible Segments

    Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5200   Accepted: 1903 Description There ...

  5. (中等) POJ 1436 Horizontally Visible Segments , 线段树+区间更新。

    Description There is a number of disjoint vertical line segments in the plane. We say that two segme ...

  6. POJ 1436 Horizontally Visible Segments

    题意: 有一些平行于y轴的线段 ,两条线段称为互相可见当且仅当存在一条水平线段连接这两条  与其他线段没交点. 最后问有多少组  3条线段,他们两两是可见的. 思路: 线段树,找出两两可见的那些组合, ...

  7. POJ 1436 (线段树 区间染色) Horizontally Visible Segments

    这道题做了快两天了.首先就是按照这些竖直线段的横坐标进行从左到右排序. 将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖. 对于一条线段来说,先查询和它能相连的所有线段,并加 ...

  8. 【解题报告】pojP1436 Horizontally Visible Segments

    http://poj.org/problem?id=1436 题目大意:有n条平行于x轴的线段,每条线段有y坐标,如果两条线段有一段x坐标数值相等,且中间没有其它线段阻隔,则称这两条线段"照 ...

  9. POJ 1436.Horizontally Visible Segments-线段树(区间更新、端点放大2倍)

    水博客,水一水. Horizontally Visible Segments Time Limit: 5000MS   Memory Limit: 65536K Total Submissions:  ...

随机推荐

  1. Scala中class和object的区别

    1.class scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C ...

  2. 监听列表ListVIew的滑动状态

    /*监听列表的滑动状态:暂时用不到 * SCROLL_STATE_FLING 时让图片不显示,提高滚动性能让滚动小姑更平滑 * SCROLL_STATE_IDLE 时显示当前屏幕可见的图片*/ mLi ...

  3. yii中的自定义组件

    yii中的自定义组件(组件就是一些自定义的公用类) 1.在项目目录中的protected/components/Xxxx.php 2.在Xxxx.php中定义一个类,类名必须与文件名相同 3.控制器中 ...

  4. html 如何引入一个公共的头部和底部

    2016-01-08 作者案:尽己之力,用心打造一个商城!当你有十二分力气时,发现用了十分力气依旧没什么进展,请不要放弃希望:或许你想得到的东西正在十二分力气的地方等你:假若你用尽了十二分力气,还是没 ...

  5. eclipse Ctrl+1 没反应

    今天上午写代码,突然发现Ctrl+1没反应了,顿时无语.昨天还好好的,今天就不行了…… 无奈,只好在网上查了查,据说快捷键冲突的原因比较大. 于是我将Ctrl+1换成了Alt+1.在eclipse中测 ...

  6. 经典SQL语句大全(绝对的经典)

    ”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度3,right(char_expr,int_expr) 返回字符串右边第int_expr个字符, ...

  7. C++编程注意事项

    1.所有成员变量在构造函数中进行初始化操作,如指针赋值为空,bool赋值为FALSE(默认为TRUE); 2.构造函数与析构函数配对出现,执行反向操作,保证执行析构之后,没有遗留问题存在: 3.如果需 ...

  8. java经验总结二:ORA-08103: 对象不再存在

    问题发生的环境: 在springMvc+mybatis框架中,调用oracle的存储过程时,碰到的一个这样的异常: org.springframework.jdbc.UncategorizedSQLE ...

  9. 哥德巴赫猜想证明(C语言实现50以内的正偶数证明)

    <一>哥德巴赫猜想内容: 一个充分大的偶数(大于或等于6)可以分解为两个素数之和. <二>实现要点: 要点: 判断素数(质数):除了1和本身没有其他约数. 最小的质数:2 判断 ...

  10. 手动通过Lucene判断该pom文件中jar是否存在,子依赖没判断

    package lucne.test; import java.io.File; import java.io.FileNotFoundException; import java.io.IOExce ...