题中定义了什么叫做可见线段。所谓可见线段就是在给定的垂直与x轴的直线中,能够在两个直线之间连接一条平行线,并且这条平行线不与任何其他的直线相交。

WA一次,就是因为没有考虑到在建立点树的过程中会出现将 [1, 2] 和 [3, 4] 视为一条连接的直线,所以最后给坐标乘以一个2.

代码如下:

#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#define MAXN 8000using namespace std;

struct Seq{int y1, y2, x;bool operator < (Seq t) const    {return x < t.x;    }}e[MAXN+5];

struct {int l, r, who;}seg[MAXN*8];

map<int,int>m[MAXN+5];

void build(int f, int l, int r){int mid = l+r >> 1;    seg[f].l = l, seg[f].r = r;    seg[f].who = 0;if (r > l)    {        build(f<<1, l, mid);        build(f<<1|1, mid+1, r);    }}

void up(int f){if (seg[f<<1].who == seg[f<<1|1].who)        seg[f].who = seg[f<<1].who;else        seg[f].who = -1;}

void modify(int f, int l, int r, int who, map<int, int>*m){int mid = seg[f].l+seg[f].r >> 1;if (seg[f].l == l && seg[f].r == r && (seg[f].who != -1 || r==l))    { if (seg[f].who != -1 && seg[f].who != 0)             m[who][seg[f].who] = 1;        seg[f].who = who;

    }else if (seg[f].r > seg[f].l)    {if (seg[f].who == 0)        {             seg[f<<1].who = seg[f<<1|1].who = seg[f].who;            seg[f].who = -1;        }else if (seg[f].who != -1)        {            m[who][seg[f].who] = 1;            seg[f<<1].who = seg[f<<1|1].who = seg[f].who;            seg[f].who = -1;        }if (r <= mid)            modify(f<<1, l, r, who, m);else if (l > mid)            modify(f<<1|1, l, r, who, m);else        {            modify(f<<1, l, mid, who, m);            modify(f<<1|1, mid+1, r, who, m);        }        up(f);    }}

int main(){    map<int,int>::iterator it1, it2;int T, M, y1, y2, x, ans;    scanf("%d", &T);    build(1, 0, 2*MAXN);while (T--)    {        ans = 0;         seg[1].who = 0;        scanf("%d", &M);for (int i = 1; i <= M; ++i)        {            scanf("%d %d %d", &e[i].y1, &e[i].y2, &e[i].x);            e[i].y1 <<= 1, e[i].y2 <<= 1;            m[i].clear();        }        sort(e+1, e+1+M);for (int i = 1; i <= M; ++i)        {//    printf("%d %d %d\n", e[i].y1, e[i].y2, e[i].x);            modify(1, e[i].y1, e[i].y2, i, m);/*    for (it = m[i].begin(); it != m[i].end(); ++it)                printf(".. %d ", it->first); */        }for(int i = 1; i <= M; ++i) // 扫描整个表        {for(it1 = m[i].begin(); it1 != m[i].end(); ++it1) // 遍历第i条线的可见线段              { int k = it1->first;  // 记录与其中的第k条线段可见                for(it2 = m[i].begin(); it2 != m[i].end(); ++it2)  // 如果第k条线段与第i条线段有共同的可见线段的话 ans++                {if (m[k].count(it2->first))                        ans++;                }            }        }        printf("%d\n",ans);            }return 0;}

转载于:https://www.cnblogs.com/Lyush/archive/2012/03/08/2385436.html

POJ-1436 线段树 区间更新相关推荐

  1. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  2. hdu 5692 Snacks(dfs序+线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...

  3. hdu 1698(线段树区间更新)

    解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...

  4. ZOJ 1610 Count the Colors (线段树区间更新)

    题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...

  5. hdu 3966(树链剖分+线段树区间更新)

    传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...

  6. Just a Hook(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 In the game of DotA, Pudge's meat hook is actual ...

  7. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,"模拟都市"是他们非常喜欢的一个游戏 ...

  8. CodeForces - 272C Dima and Staircase (线段树区间更新)

    题意: 见以下样例,给出 5 个区间,每个区间的高度已知.一共 4 次操作.每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图. 问每次垒木块的高度是多少? Input 5 1 2 ...

  9. CDOJ-1057 秋实大哥与花(线段树区间更新)

    秋实大哥与花 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  10. Codeforces 444C DZY Loves Colors 线段树区间更新

    // Codeforces 444C DZY Loves Colors 线段树区间更新// 题目链接:// http://codeforces.com/problemset/problem/444/C ...

最新文章

  1. ISA SERVER 2004 对多重网络支持功能简述
  2. ubuntu设置root用户密码
  3. 深入 理解 Statement 和 PreparedStatement 【转】
  4. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】...
  5. CodeForces - 1486E Paired Payment(分层图最短路)
  6. 基于维纳滤波的语音增强算法 matlab,基于维纳滤波语音增强算法的改进实现
  7. mysql权限分立_MySQL设置3权分立
  8. STM32H7---高速缓存Cache(一)
  9. 会计考计算机哪些知识,2017会计从业考试《会计电算化》考点之计算机网络基本知识...
  10. 中兴的自毁与自救:封杀7年、禁用 Android,76岁创始人奔走前线!
  11. Ztree 仿淘宝树结构完美实现 移动 右键增删改
  12. [LeetCode]129. Sum Root to Leaf Numbers路径数字求和
  13. mybatis 依赖于jdbc_面试BAT问的最多的27道MyBatis 面试题(含答案和思维导图总结)...
  14. 微信项目直播开发(一)
  15. Opencv之色度图
  16. Android 更换皮肤
  17. Unity Shader学习记录(6) —— 高光反射光照模型和内置计算函数
  18. 2013“韩国小姐”选美20位佳丽的脸到底有多相似?20位佳丽的合成脸美若天仙。
  19. 您需要Administrators提供的权限才能对此文件进行更改
  20. RAID磁盘阵列是什么(一看就懂)

热门文章

  1. 存储过程与事务应用两三事
  2. Apache配置代理服务器的方法(2)
  3. eclipse 切换svn账号
  4. Gotchas 44-引用和临时对象
  5. 悟透LoadRunner - 什么是性能测试?
  6. c/c++ 标准库 插入迭代器 详解
  7. 什么是跨域,什么是同源
  8. Linux常用命令----文件处理命令
  9. HDU 1426 Sudoku Killer【DFS 数独】
  10. 详解JDBC与Hibernate区别