POJ 1436 (线段树 区间染色) Horizontally Visible Segments
这道题做了快两天了。首先就是按照这些竖直线段的横坐标进行从左到右排序。
将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖。
对于一条线段来说,先查询和它能相连的所有线段,并加入到一个有向图里面,一遍后面O(n3)暴力统计答案。
然后就是update,用这个线段将对应的区间“染色”
还要注意一个情况就是:
0 3 1, 0 1 2, 2 3 2, 0 3 3折四条线段
| | |
| |
| | |
很明显第一和第三条线段是可相连的,但是中间两条会覆盖掉左边的线段,根据以往的经验,之间将所有纵坐标乘二就好啦。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
int setv[maxn << ];
bool G[maxn][maxn]; int n, qL, qR, v; struct Segment
{
int y1, y2, x;
Segment() {}
Segment(int y1, int y2, int x):y1(y1), y2(y2), x(x) {}
bool operator < (const Segment& rhs) const
{ return x < rhs.x; }
}seg[maxn]; void pushdowm(int o)
{
if(setv[o])
{
setv[o*] = setv[o*+] = setv[o];
setv[o] = ;
}
} void update(int o, int L, int R)
{
if(qL <= L && qR >= R) { setv[o] = v; return; }
pushdowm(o);
int M = (L + R) / ;
if(qL <= M) update(o*, L, M);
if(qR > M) update(o*+, M+, R);
} void query(int o, int L, int R)
{
if(setv[o]) { G[v][setv[o]] = true; return; }
if(L == R) return;
int M = (L + R) / ;
if(qL <= M) query(o*, L, M);
if(qR > M) query(o*+, M+, R);
} int main()
{
//freopen("in.txt", "r", stdin); int T; scanf("%d", &T);
while(T--)
{
memset(setv, , sizeof(setv));
memset(G, false, sizeof(G)); scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d%d%d", &seg[i].y1, &seg[i].y2, &seg[i].x);
sort(seg + , seg + + n);
for(int i = ; i <= n; i++)
{
qL = seg[i].y1 * ; qR = seg[i].y2 * ;
v = i;
query(, , maxn * );
update(, , maxn * );
} int ans = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++) if(G[i][j])
for(int k = ; k <= n; k++) if(G[i][k] && G[j][k]) ans++;
printf("%d\n", ans);
} return ;
}
代码君
POJ 1436 (线段树 区间染色) Horizontally Visible Segments的更多相关文章
- HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)
题目大意:有n个人,给你他们的关系(老板和员工),没有直属上司的人就是整个公司的领导者,这意味着n个人形成一棵树(多叉树).当一个人被分配工作时他会让他的下属也做同样的工作(并且立即停止手头正在做的工 ...
- hdu 5023(线段树区间染色,统计区间内颜色个数)
题目描述:区间染色问题,统计给定区间内有多少种颜色? 线段树模板的核心是对标记的处理 可以记下沿途经过的标记,到达目的节点之后一块算,也可以更新的时候直接更新到每一个节点 Lazy操作减少修改的次数( ...
- 线段树区间染色 ZOJ 1610
Count the Colors ZOJ - 1610 传送门 线段树区间染色求染色的片段数 #include <cstdio> #include <iostream> #in ...
- poj 2528 线段树区间修改+离散化
Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...
- POJ 3667 线段树区间合并
http://www.cnblogs.com/scau20110726/archive/2013/05/07/3065418.html 用线段树,首先要定义好线段树的节点信息,一般看到一个问题,很难很 ...
- Mayor's posters POJ - 2528 线段树区间覆盖
//线段树区间覆盖 #include<cstdio> #include<cstring> #include<iostream> #include<algori ...
- hdu 1698+poj 3468 (线段树 区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...
- poj 3468 线段树区间更新/查询
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- POJ 3468 (线段树 区间增减) A Simple Problem with Integers
这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...
随机推荐
- Sqli-labs less 20
Less-20 从源代码中我们可以看到cookie从username中获得值后,当再次刷新时,会从cookie中读取username,然后进行查询. 登录成功后,我们修改cookie,再次刷新时,这时 ...
- ASP.NET和JSP相似方法总结(持续中。。)
一.HTTP请求处理 1.获取GET请求数据 ASP.NET:Request.QueryString[name] JSP:request.getParameter(String name); 2.解决 ...
- 图解JavaScript执行环境结构
JavaScript引擎在开始编译代码的时候,会对JavaScript代码进行一次预编译,生成一个执行环境,比如如下代码: window.onload=function(){ function sub ...
- Activity学习(一)——状态转变
(转自:http://blog.csdn.net/flowingflying/article/details/6415323) Android很大的应用场景是手机,有一些应用具有特别的优先级别,例如电 ...
- POJ 3335 Rotating Scoreboard(半平面交求多边形核)
题目链接 题意 : 给你一个多边形,问你在多边形内部是否存在这样的点,使得这个点能够看到任何在多边形边界上的点. 思路 : 半平面交求多边形内核. 半平面交资料 关于求多边形内核的算法 什么是多边形的 ...
- hdu 4259 Double Dealing
思路: 找每一个数的循环节,注意优化!! 每次找一个数的循环节时,记录其路径,下次对应的数就不用再找了…… 代码如下: #include<iostream> #include<cst ...
- 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8组件结构全解析
转自: http://blog.csdn.net/poem_qianmo/article/details/19925819 本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:ht ...
- proc插入数据到数据库
#include<stdio.h>EXEC SQL INCLUDE SQLCA; void insert (char password_[6],char id_[20],int balan ...
- Spring框架学习之第7节
配置Bean的细节 ☞尽量使用scope=”singleton”,不要使用prototype,因为这样对我们的性能影响较大 ②如何给集合类型注入值 Java中主要的map,set,list / 数组 ...
- Spring框架学习之第2节
传统的方法和使用spring的方法 使用spring,没有new对象,我们把创建对象的任务交给了spring的框架,通过配置用时get一下就行. 项目结构 applicationContext.xml ...