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 ...
随机推荐
- ajax请求成功后js刷新当前页,当前页是post查询结果(用post请求进行搜索筛选)的问题
下面的一个ajax操作,原先操作成功会刷新当前页,保证用户看到的数据是最新的,一般情况不会出现问题.$.ajax({ url: url + "/addTeacherAuth", / ...
- Js面向对象之观察者模式
//模拟一个目标可能拥有的一些列依赖 function ObserverList() { this.observerList = []; }; //添加一个观察者 ObserverList.proto ...
- UVA 340 Master-Mind Hints 猜密码游戏(水)
题意: 给一串密码(第一行),接着再给你很多行猜测,针对每行猜测,输出两个数字,分表代表:同一列上匹配的个数,不同列上匹配的个数.注:匹配指的是一次,一旦配对,不能再与其他配对. 思路: 每接受一行猜 ...
- linux 命令——55 traceroute(转)
通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一 ...
- 【洛谷4252】[NOI2006] 聪明的导游(提答题)
点此看题面 大致题意: 给你一张\(n\)个点.\(m\)条边的无向图,让你找出图上的一条不经过重复节点的最长路(提答+\(spj\)). 随机化乱搞 针对这种提答题,我们就要用随机化乱搞(Cptra ...
- BSGS算法初探
前言 \(BSGS\)算法,全称\(Baby\ Step\ Giant\ Step\),即大小步算法.某些奆佬也称其为拔(Ba)山(Shan)盖(Gai)世(Shi)算法. 它的主要作用是求解形式如\ ...
- os.walk 模块
os.walk()可以得到一个三元tupple(dirpath, dirnames, filenames),其中第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件. 其中dirpa ...
- STM32启动流程
启动文件主要工作: . 设置堆栈指针SP=_initial_sp . 设置PC指针=Reset_Handler . 配置系统时钟 . 配置外部SRAM用于程序变量等数据存储(可选) . 调用C库中的_ ...
- 优化通过redis实现的一个抢红包流程【下】
上一篇文章通过redis实现的抢红包通过测试发现有严重的阻塞的问题,抢到红包的用户很快就能得到反馈,不能抢到红包的用户很久(10秒以上)都无法获得抢红包结果,起主要原因是: 1.用了分布式锁,导致所有 ...
- 如何更改VirtualBox虚拟电脑内存大小