poj 1389 多边形面积
来源:互联网 发布:淘宝购买电影资源 编辑:程序博客网 时间:2024/04/28 10:05
与poj 1151 亚特兰蒂斯完全相同
再次熟悉下线段树,离散化,扫描线的写法,求面积相对而言还算是比较简单的
#include <iostream>#include <vector>#include <map>#include <list>#include <set>#include <deque>#include <stack>#include <queue>#include <algorithm>#include <cmath>#include <cctype>#include <cstdio>#include <iomanip>#include <cmath>#include <cstdio>#include <iostream>#include <string>#include <sstream>using namespace std;///宏定义const int INF = 20000000;const int maxn = 10010;const int MAXN = 10010;///全局变量 和 函数int yypos[MAXN];struct line{int x;int y1, y2;int flag;}lines[MAXN];//扫描线段struct node{int lc, rc;int len;//区间长度int flag;//区间标记}tree[MAXN];int xx1, yy1, xx2, yy2;int cmp(line l1, line l2) { return l1.x < l2.x; } //建树 插入 删除 void buildtree(int l, int r, int pos){tree[pos].lc = l;tree[pos].rc = r;tree[pos].len = tree[pos].flag = 0;if (l + 1 == r)return;int mid = (l + r) / 2;buildtree(l, mid, pos * 2);buildtree(mid, r, pos * 2 + 1);}void update(int pos){if (tree[pos].flag > 0)tree[pos].len = yypos[tree[pos].rc] - yypos[tree[pos].lc];else if (tree[pos].lc + 1 == tree[pos].rc)tree[pos].len = 0;elsetree[pos].len = tree[pos * 2].len + tree[pos * 2 + 1].len;}void insert(line e, int pos){if (e.y1 == yypos[tree[pos].lc] && e.y2 == yypos[tree[pos].rc])tree[pos].flag += e.flag;else{int mid = (tree[pos].lc + tree[pos].rc) / 2;if (e.y2 <= yypos[mid])insert(e, pos * 2);else if (e.y1 >= yypos[mid])insert(e, pos * 2 + 1);else{line temp;temp = e;temp.y2 = yypos[mid];insert(temp, pos * 2);temp = e;temp.y1 = yypos[mid];insert(temp, pos * 2 + 1);}}update(pos);}int main(){///int i, j;int line_cnt;int ynums;///变量定义while (1){line_cnt = 0;cin >> xx1 >> yy1 >> xx2 >> yy2;if (xx1 == -1 && yy1 == -1 && xx2 == -1 && yy2 == -1)break;lines[line_cnt].x = xx1;lines[line_cnt].y1 = yy1;lines[line_cnt].y2 = yy2;lines[line_cnt].flag = 1;yypos[line_cnt++] = yy1;lines[line_cnt].x = xx2;lines[line_cnt].y1 = yy1;lines[line_cnt].y2 = yy2;lines[line_cnt].flag = -1;yypos[line_cnt++] = yy2;while (1){cin >> xx1 >> yy1 >> xx2 >> yy2;if (xx1 == -1 && yy1 == -1 && xx2 == -1 && yy2 == -1)break;lines[line_cnt].x = xx1;lines[line_cnt].y1 = yy1;lines[line_cnt].y2 = yy2;lines[line_cnt].flag = 1;yypos[line_cnt++] = yy1;lines[line_cnt].x = xx2;lines[line_cnt].y1 = yy1;lines[line_cnt].y2 = yy2;lines[line_cnt].flag = -1;yypos[line_cnt++] = yy2;}ynums = line_cnt;sort(yypos, yypos + ynums); ynums = unique(yypos, yypos + ynums) - yypos;//去重,STL的unique函数 sort(lines, lines + line_cnt, cmp); //建树buildtree(0, ynums - 1, 1);int ans = 0;insert(lines[0], 1);for (i = 1; i < line_cnt; i++){ans += (lines[i].x - lines[i - 1].x) * tree[1].len;insert(lines[i], 1);}cout << ans << endl;}///运行部分///结束return 0;}
- poj 1389 多边形面积
- POJ 1654 多边形面积
- poj 1265 多边形面积
- poj 1654 多边形面积
- poj 1654 多边形面积计算
- poj 1654 Area 多边形面积
- POJ 1654 Area 多边形面积
- POJ 1654 Area 多边形面积
- POJ 1654 Area (多边形面积)
- POJ 1654 Area(多边形面积)
- POJ 1654 Area [多边形面积]
- poj 3907 求多边形面积
- POJ 1654 求多边形面积
- POJ 1654 Area (多边形面积)
- POJ 1654 Area(任意多边形面积)
- poj 1654 Area(叉积求多边形面积)
- POJ 1654 Area (计算多边形面积)
- poj 3907 Build Your Home 多边形面积
- 搭建android 2.2 开发环境
- 【牛人】连接
- C/C++单元测试框架Framework
- 异常处理.cpp
- Simultaneous minimum and maximum (Solution to algorthm)
- poj 1389 多边形面积
- 图形化用户界面
- jsp自定义标签实现权限拦截
- 3 双链表
- Max Subsequence Sum 最大子序列和问题 O(NlogN)与O(N)算法的对比
- php,js常用的一些总结
- 解决 Subversion 的 “svn: Can't convert string from 'UTF-8' to native encoding” 错误
- axis2 webservice学习笔记
- 环链表