【杭电多校round3】G Interstellar Travel
题意
给定二维平面上的n个点,保证只有一个点(P_1)横坐标最小,一个点横坐标最大(P_n),在坐标轴上其余点无序且可能重合
即 y_1=y_n=0, 0=x_1<x_2,x_3,...,x_n−1<x_n
要沿着x严格递增的方式选择一些降落点,从P_1走到P_n
从i点起飞到j点降落,花费的代价是x_i×y_j−x_j×y_i ,
求花费代价最小的方案,输出字典序最小的答案
分析
这题很多人一眼看过去是斜率DP。。。原谅本辣鸡没看不出来。。。但是推式子却推不出来,Claris还是你Claris,迷惑性很强。。。
观察一下上面的代价式子,会发现是一个向量叉积的式子,两两之间选择的点求叉积,联系到三角剖分,可以知道最后的花费代价是所有点连起来的有向面积的和。
如果斜率减小,则获得负面积,所以我们要沿着斜率减小的情况走。也就是维护一个上凸包。
起点,终点,凸包上的拐点必须要选,重合的点只选字典序最小的一个,共线的点,则选择字典序最小的子序列
解决重合的点可以考虑在读入点,排序后就预处理掉
共线的点可以考虑贪心从右往左,如果当前结点序号比前一个选的共线的点还要小,则这个点也选取
(题目要是没看错的话应该可以秒嘞。。。在想复杂了的情况下,思路已经很接近了。。。
代码
#include<bits/stdc++.h>
using namespace std;
struct Point{long long x,y;int id;bool operator < (Point b) {return x<b.x || (x == b.x && y < b.y);}bool operator == (Point b){return x == b.x && y == b.y;}long long operator *(Point b){return x*b.y-y*b.x;}Point operator - (Point b){return Point{x-b.x,y-b.y,0};}
}s[200005],a[200005];
bool book[200005];
int n,m;
int solve()
{int m = 0,k=1;s[m++] = a[n];for(int i = n-1;i>=1;i--){while(m>k && (s[m-1]-s[m-2])*(a[i]-s[m-2])<0) m--;s[m++] = a[i];}m--;book[0] = book[m] = 1;for(int i = 1;i<m;i++) if((s[i-1]-s[i])*(s[i]-s[i+1])) book[i] = 1;int pre;for(int i = 0;i<m;i++)if(book[i] == 1) pre = i;else{if(s[i].id<s[pre].id)book[i] = 1, pre = i;}putchar('1');for(int i = m-1;i>=0;i--){if(book[i]) printf(" %d",s[i].id);}putchar('\n');}
int main()
{int _;scanf("%d",&_);while(_--){memset(book,0,sizeof(book));scanf("%d",&n);for(int i = 1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y),a[i].id = i;sort(a+1,a+n+1);int now = 1;for(int i = 2;i<=n;i++){if(a[i] == a[now]){if(a[i].id < a[now].id) a[now] = a[i];}else a[++now] = a[i];}n = now;solve();}
}
转载于:https://www.cnblogs.com/greenty1208/p/9394336.html
【杭电多校round3】G Interstellar Travel相关推荐
- 树形dp ---- 2018年杭电多校第二场 H travel
题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...
- 2022杭电多校4 G - Climb Stairs
input: 4 6 1 4 2 2 1 1 9 3 4 2 2 2 3 8 1 3 1 2 3 1 2 7 2 3 4 3 2 7 20 20 20 output: YES YES NO NO 题目 ...
- 2022杭电多校(一)
2022杭电多校(一) 文章目录 2022杭电多校(一) 一.比赛小结 二.题目分析及解法(基础题) 1001.String 1002.Dragon slayer 1003.BackPack 1004 ...
- 杭电多校第六场个人补题6 7 9 10 12
杭电多校第六场个人补题6 7 9 10 12 6 题意 给定一棵有n结点的树,点权为1~n,求对所有结点子树的mex操作和的最大值 思路 其实就是从最底部开始网上找,由于0是唯一的一个,所欲最好给在最 ...
- 2021杭电多校补题——第一场
2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...
- 2022杭电多校(十)
2022杭电多校(十) 文章目录 2022杭电多校(十) 一.比赛小结 二.题目分析及解法(基础题) 1001.Winner Prediction 1003.Wavy Tree 1004.Averag ...
- 2022杭电多校(二)
2022杭电多校(二) 文章目录 2022杭电多校(二) 一.比赛小结 二.题目分析及解法(基础题) 1001.Static Query on Tree 1002.C++ to Python 1003 ...
- 2022杭电多校(五)
2022杭电多校(五) 文章目录 2022杭电多校(五) 一.比赛小结 二.题目分析及解法(基础题) 1003.Slipper 1006.BBQ 1007.Count Set 1010.Braggin ...
- 2022杭电多校(三)
2022杭电多校(三) 文章目录 2022杭电多校(三) 一.比赛小结 二.题目分析及解法(基础题) 1001.Equipment Upgrade 1002.Boss Rush 1003.Cyber ...
最新文章
- C语言网络编程:多路IO select实现多客户端
- python 光标位置输入文字_Python 移动光标位置的方法
- Windows环境下在IDEA编辑器中spark开发安装步骤
- 【Linux 内核】进程优先级与调度策略 ③ ( 设置、获取线程优先级的核心函数 | 修改线程调度策略函数 )
- python 知识点总结
- 读书印记 - 《创新者的解答》
- 程序员肚子越来越大_肚子越来越大,除了肥胖还可能是疾病信号!腰间搓一搓,排出痰浊,消脂防病~...
- Scala中class与object区别
- tree工具类 TreeUtils.java
- STM32之FSMC的液晶使用
- Qt UDP组播的应用
- 机器学习笔记 - 基于最简单的编码器/解码器架构SegNet进行语义分割
- php加密=>python解密或者python加密=>php解密
- 机器学习(六):特征降维和主成分分析法
- 创建zemax非序列光学系统
- 阿里云免费SSL证书申请详细流程
- php小写字母改成大写,php如何将小写字母转为大写
- google Map API实现地址解析
- 【MOOC】华中科技大学计算机组成原理慕课答案-第六章-中央处理器(一)
- 广东计算机复试英语翻译,广东考研指南:参加研究生复试,英语面试自我介绍技巧...
热门文章
- 视频开发技术安全保障措施
- 在安卓上部署服务器--ksweb+wordpress
- PHP项目部署在安卓服务器导出文件乱码问题(ksweb-mysql+php7+apache)
- day01 PySpark
- (转)如何使用Psyco为你的Python程序提速。
- 分别从中序、后续中组成二叉树(likou106)
- xshell启动的时候报initialize flexnet service failed error code 50003
- airflow error Flask-Appbuilder setp command
- Excel收纳箱:记录下如何通过VBA代码获取当前列
- iOS 多线程安全数组