ZOJ :: Problems :: Show Problem

1436 -- Horizontally Visible Segments

  用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能看到的线段记录下来。这里要用到拆点,在两个整点之间插入一个点。

  最后O(n^2)统计三角形的个数,因为每条线段可以看见的另外的线段的条数不多,所以可以直接枚举两条边。

代码如下:

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <set> using namespace std; const int N = ;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define root 0, 16000, 1
int cov[N << ]; void up(int rt) {
if (~cov[rt << ] && cov[rt << ] == cov[rt << | ]) cov[rt] = cov[rt << ];
else cov[rt] = -;
} void down(int rt) { if (~cov[rt]) cov[rt << ] = cov[rt << | ] = cov[rt];} void build(int L, int R, int l, int r, int rt) {
if (l >= r) {
cov[rt] = L <= l && r <= R ? : ;
return ;
}
int m = l + r >> ;
build(L, R, lson);
build(L, R, rson);
up(rt);
} set<int> edge[N >> ]; void update(int k, int L, int R, int l, int r, int rt) {
if (L <= l && r <= R && ~cov[rt]) {
if (cov[rt]) edge[k].insert(cov[rt]);
cov[rt] = k;
return ;
}
int m = l + r >> ;
down(rt);
if (L <= m) update(k, L, R, lson);
if (m < R) update(k, L, R, rson);
up(rt);
} struct Node {
int l, r, p;
} seg[N >> ]; bool cmp(Node a, Node b) { return a.p < b.p;} int main() {
// freopen("in", "r", stdin);
int T, n;
scanf("%d", &T);
while (T-- && ~scanf("%d", &n)) {
for (int i = ; i <= n; i++) {
scanf("%d%d%d", &seg[i].l, &seg[i].r, &seg[i].p);
seg[i].l <<= , seg[i].r <<= ;
}
sort(seg + , seg + n + , cmp);
edge[].clear();
build(seg[].l, seg[].r, root);
for (int i = ; i <= n; i++) {
edge[i].clear();
update(i, seg[i].l, seg[i].r, root);
}
set<int>::iterator si, sj;
int ans = ;
for (int i = ; i <= n; i++) {
// cout << i << " : ";
// for (si = edge[i].begin(); si != edge[i].end(); si++) cout << *si << ' ';
// cout << endl;
for (si = edge[i].begin(); si != edge[i].end(); si++) {
int t = *si;
for (sj = edge[i].begin(); sj != edge[i].end(); sj++) {
ans += edge[t].find(*sj) != edge[t].end();
}
}
}
printf("%d\n", ans);
}
return ;
}

——written by Lyon

poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)的更多相关文章

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

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

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

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

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

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

  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

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

  6. POJ 1436 Horizontally Visible Segments

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

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

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

  8. poj1436 Horizontally Visible Segments

    这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见 ...

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

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

随机推荐

  1. 2019.9.26 csp-s模拟测试52 反思总结

    刚刚写了一个小时的博客没了,浏览器自动刷新. 一!个!小!时! 鼠标键盘电脑哪个都不能摔,气死我了. 垃圾选手T1T2没思路,T3倒是想出来得比较早,靠T3撑着分数. 数据结构学傻选手,属实垃圾. T ...

  2. CSS实现火焰效果

    代码如下 //主要就是用css动画实现的 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  3. Django与HTML业务基本结合--基本的用户名密码提交方法2

    from django.shortcuts import render # Create your views here. from django.shortcuts import render de ...

  4. agc015D A or...or B Problem

    题意:求用若干个(至少一个)[A,B]中的数进行or操作能得到多少本质不同的数 $1 \leq A \leq B < 2^{60}$ 一直在想数位dp,看了题解之后感觉自己就是个sb 我们先把$ ...

  5. ML面试1000题系列(71-80)

    本文总结ML面试常见的问题集 转载来源:https://blog.csdn.net/v_july_v/article/details/78121924 71.看你是搞视觉的,熟悉哪些CV框架,顺带聊聊 ...

  6. 贝叶斯--旧金山犯罪分类预测和电影评价好坏 demo

    来源引用:https://blog.csdn.net/han_xiaoyang/article/details/50629608 1.引言 贝叶斯是经典的机器学习算法,朴素贝叶斯经常运用于机器学习的案 ...

  7. 定位真机运行能用但是打包成apk就不能用的解决方法

    打包apk的SHA1,与key的SHA1(这是多人开发的通病不同电脑共同开发一个app的常见错误之一)不一致.解决方法: 今天虽然离职了,但是今天遇到的是,当我在用高德地图开发的时候,在Android ...

  8. lingo 出现63. MODEL IS ILL DEFINED 解决办法

    63. MODEL IS ILL DEFINED. CHECK FOR UNDEFINED INDICES AND/OR CONDITIONS IN EXPRESSION: EXPRESSION. 还 ...

  9. FZU 1576【计算几何/费马点】

    Oaiei居住在A城市,并且是这个城市建设的总设计师.最近有个问题一直困恼着他.A城市里有三个大型工厂,每个大型工厂每天都需要消耗大量的石油,现在城市里要建设一个石油中转站,从石油中转站到三个大型工厂 ...

  10. This Product is covered by one or more of the folloWing patents

    借用一下网络图片,作为描述: 原因: 启动方式使用了网络启动, 解决方案: 进入bios,修改启动方式,禁用网卡驱动,使用从硬盘启动或者从U盘启动即可.