POJ-1436 线段树 区间更新
题中定义了什么叫做可见线段。所谓可见线段就是在给定的垂直与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 线段树 区间更新相关推荐
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
直接将这3题 放一起了 今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...
- hdu 5692 Snacks(dfs序+线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...
- hdu 1698(线段树区间更新)
解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...
- ZOJ 1610 Count the Colors (线段树区间更新)
题目链接 题意 : 一根木棍,长8000,然后分别在不同的区间涂上不同的颜色,问你最后能够看到多少颜色,然后每个颜色有多少段,颜色大小从头到尾输出. 思路 :线段树区间更新一下,然后标记一下,最后从头 ...
- hdu 3966(树链剖分+线段树区间更新)
传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...
- Just a Hook(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698 In the game of DotA, Pudge's meat hook is actual ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,"模拟都市"是他们非常喜欢的一个游戏 ...
- CodeForces - 272C Dima and Staircase (线段树区间更新)
题意: 见以下样例,给出 5 个区间,每个区间的高度已知.一共 4 次操作.每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图. 问每次垒木块的高度是多少? Input 5 1 2 ...
- CDOJ-1057 秋实大哥与花(线段树区间更新)
秋实大哥与花 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit St ...
- Codeforces 444C DZY Loves Colors 线段树区间更新
// Codeforces 444C DZY Loves Colors 线段树区间更新// 题目链接:// http://codeforces.com/problemset/problem/444/C ...
最新文章
- ISA SERVER 2004 对多重网络支持功能简述
- ubuntu设置root用户密码
- 深入 理解 Statement 和 PreparedStatement 【转】
- BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】...
- CodeForces - 1486E Paired Payment(分层图最短路)
- 基于维纳滤波的语音增强算法 matlab,基于维纳滤波语音增强算法的改进实现
- mysql权限分立_MySQL设置3权分立
- STM32H7---高速缓存Cache(一)
- 会计考计算机哪些知识,2017会计从业考试《会计电算化》考点之计算机网络基本知识...
- 中兴的自毁与自救:封杀7年、禁用 Android,76岁创始人奔走前线!
- Ztree 仿淘宝树结构完美实现 移动 右键增删改
- [LeetCode]129. Sum Root to Leaf Numbers路径数字求和
- mybatis 依赖于jdbc_面试BAT问的最多的27道MyBatis 面试题(含答案和思维导图总结)...
- 微信项目直播开发(一)
- Opencv之色度图
- Android 更换皮肤
- Unity Shader学习记录(6) —— 高光反射光照模型和内置计算函数
- 2013“韩国小姐”选美20位佳丽的脸到底有多相似?20位佳丽的合成脸美若天仙。
- 您需要Administrators提供的权限才能对此文件进行更改
- RAID磁盘阵列是什么(一看就懂)