CSU-2116 Polyline Simplification
CSU-2116 Polyline Simplification
Description
Mapping applications often represent the boundaries of countries, cities, etc. as polylines, which are connected sequences of line segments. Since fine details have to be shown when the user zooms into the map, these polylines often contain a very large number of segments. When the user zooms out, however, these fine details are not important and it is wasteful to process and draw the polylines with so many segments. In this problem, we consider a particular polyline simplification algorithm designed to approximate the original polyline with a polyline with fewer segments.
A polyline with n segments is described by n + 1 points \(p_0=(x_0,y_0),...,p_n=(x_n,y_n)\), with the ith line segment being pi−1pi. The polyline can be simplified by removing an interior point \(p_i\)(1≤i≤n−1), so that the line segments $p_{i−1} p_i $and \(p_ip_{i+1}\) are replaced by the line segment \(p_{i − 1}p_{i + 1}\). To select the point to be removed, we examine the area of the triangle formed by \(p_{i−1},p_i\),and $ p_{i+1}$(the area is 0 if the three points are colinear), and choose the point pi such that the area of the triangle is smallest. Ties are broken by choosing the point with the lowest index. This can be applied again to the resulting polyline, until the desired number m of line segments is reached.
Consider the example below.
The original polyline is shown at the top. The area of the triangle formed by p2,p3,and p4 is considered (middle), and p3 is removed if the area is the smallest among all such triangles. The resulting polyline after p3 is removed is shown at the bottom.
Input
The first line of input contains two integers n(2≤n≤200000) and m(1≤m<n)m(1≤m<n). The next n + 1 lines specify p0,...,pn. Each point is given by its x and y coordinates which are integers between −5000 and 5000 inclusive. You may assume that the given points are strictly increasing in lexicographical order. That is, \(xi<x_{i+1}\) , or \(xi=x_{i+1}\) and \(yi<y_{i+1}\) for all 0≤i<n .
Output
Print on the kth line the index of the point removed in the kth step of the algorithm described above (use the index in the original polyline).
Sample Input
10 7
0 0
1 10
2 20
25 17
32 19
33 5
40 10
50 13
65 27
75 22
85 17
Sample Output
1
9
6
题解
题意:给定n+1个点,每个点可以与它左右两个点形成一个三角形,每次删去最小的那个三角形的中间那个点,直到剩下m+1个点,求被删除点的编号。
这是一道模拟题,需要用到叉积(向量积)计算三角形面积
\]
带入三点坐标化简一下即可,由于题目中所给坐标均为整数,所以我们可以存不除2的结果,这样都为整数可以用int存。我们用set维护一下最小三角形的面积,该三角形中间点是第几个点。用数组模拟一下双向链表维护一下这个点左右各是哪个点,删除这个点时更新一下就好了,记得如果该三角形不是第一个或者最后一个三角形的话还要分别更新一下新形成的三角形的面积。
#include<bits/stdc++.h>
#define maxn 200050
using namespace std;
struct point {
int x, y;
} a[maxn];
int l[maxn], r[maxn];
int area[maxn];
struct node {
int val, id;
node(int val = 0, int id = 0): val(val), id(id) {}
bool operator < (const node &a) const {
if (val == a.val) return id < a.id;
else return val < a.val;
}
};
int calc1(int x) {
int p1 = l[x], p2 = x, p3 = r[x];
return abs(a[p1].x * a[p2].y + a[p2].x * a[p3].y + a[p3].x * a[p1].y - a[p1].x * a[p3].y - a[p2].x * a[p1].y - a[p3].x * a[p2].y);
}
set<node> s;
int main() {
int n, m;
scanf("%d%d", &n, &m);
int k = n - m;
for (int i = 0; i <= n; i++) {
scanf("%d%d", &a[i].x, &a[i].y);
}
r[0] = 1;
l[n] = n - 1;
for (int i = 1; i < n; i++) {
l[i] = i - 1; r[i] = i + 1;
area[i] = calc1(i);
s.insert(node(area[i], i));
}
for (int i = 1; i <= k; i++) {
set<node>::iterator it = s.begin();
int now = (*it).id;
printf("%d\n", now);
s.erase(it);
l[r[now]] = l[now];
r[l[now]] = r[now];
if (l[now] > 0) {
it = s.find(node(area[l[now]], l[now]));
s.erase(it);
area[l[now]] = calc1(l[now]);
s.insert(node(area[l[now]], l[now]));
}
if (r[now] < n) {
it = s.find(node(area[r[now]], r[now]));
s.erase(it);
area[r[now]] = calc1(r[now]);
s.insert(node(area[r[now]], r[now]));
}
}
return 0;
}
/**********************************************************************
Problem: 2116
User: Artoriax
Language: C++
Result: AC
Time:392 ms
Memory:15308 kb
**********************************************************************/
CSU-2116 Polyline Simplification的更多相关文章
- 中南大学2019年ACM寒假集训前期训练题集(基础题)
先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...
- ArcEngine开发各种几何错误代码
E_GEOMETRY_AMBIGUOUSPARTTYPE - Static variable in interface com.esri.arcgis.geometry.esriGeometryErr ...
- psimpl_v7_win32_demo
psimpl - generic n-dimensional polyline simplification 通用N维折线简化程序 Author - Elmar de Koning 作者 - Elma ...
- [svg 翻译教程]Polyline(折线)polygon(多边形)
原文: http://tutorials.jenkov.com/svg/polygon-element.html Polyline 虽然说这个 元素我没用过,但是还是蛮强大的,也翻译下 示例 < ...
- [javascript svg fill stroke stroke-width points polygon属性讲解] svg fill stroke stroke-width points polygon绘制多边形属性并且演示polyline和polygon区别讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- [javascript svg fill stroke stroke-width points polyline 属性讲解] svg fill stroke stroke-width points polyline 绘制折线属性讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- csu 1812: 三角形和矩形 凸包
传送门:csu 1812: 三角形和矩形 思路:首先,求出三角形的在矩形区域的顶点,矩形在三角形区域的顶点.然后求出所有的交点.这些点构成一个凸包,求凸包面积就OK了. /************** ...
- CSU 1503 点到圆弧的距离(2014湖南省程序设计竞赛A题)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1503 解题报告:分两种情况就可以了,第一种是那个点跟圆心的连线在那段扇形的圆弧范围内,这 ...
- CSU 1120 病毒(DP)
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1120 解题报告:dp,用一个串去更新另一个串,递推方程是: if(b[i] > a ...
随机推荐
- springMvc-框架搭建
搭建springmvc框架的步骤: 1.在web.xml中配置springMvc的servlet 2.创建controller处理页面传来的数据, 3.床架springMvc文件,处理视图: 3.1: ...
- 【洛谷5390】[Cnoi2019] 数学作业(位运算)
点此看题面 大致题意: 给你一个集合,求所有子集异或和之和. 大致思路 首先,我们很容易想到去对二进制下每一位分别讨论. 枚举当前位,并设共有\(x\)个数当前位上为\(1\),则有\((n-x)\) ...
- python setup.py install 报错
python setup.py install 报错信息 [root@VM_25_28_centos psutil-2.0.0]# python setup.py install running in ...
- PAT (Basic Level) Practise (中文)- 1005. 继续(3n+1)猜想 (25)
http://www.patest.cn/contests/pat-b-practise/1005 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证 ...
- Oracle grant connect, resource to user语句中的权限
博主在 Oracle 11g r2上测试(测试日期:2017.10.30): 用sys登陆到oracle中,执行以下两条语句: select * from role_sys_privs WHERE R ...
- java算法面试题:递归算法题1
递归算法题1 一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来.例:n=1237则输出为:1237,2474,4948,9896,9 ...
- 避免修改Android.mk添加cpp文件路径
手工输入项目需要编译的cpp文件到Android.mk里的缺点 1)繁琐,如果cpp文件很多,简直无法忍受 2)手工输入过程中容易出现错误 3)如果cpp文件更改名称,需要修改android.mk文件 ...
- SAP事件 Event Flow(转载)
1 报表过程事件 报表过程事件是在报表运行过程中由系统自动控制,按照一定次序被触发的事件,其目的是从数据库中选择数据并整理,准备进行列表输出.这些事件从报表程序启动开始就被系统顺序触发,现分述如下: ...
- python2与python3下的base64模块
Python2的编解码 python2中程序数据类型默认为ASCII,所以需要先将数据解码(decode)成为Unicode类型,然后再编码(encode)成为想要转换的数据类型(gbk,utf-8, ...
- 抽屉head部分,hover应用,鼠标放上变色
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...