题意

给定二维平面上的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相关推荐

  1. 树形dp ---- 2018年杭电多校第二场 H travel

    题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...

  2. 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 题目 ...

  3. 2022杭电多校(一)

    2022杭电多校(一) 文章目录 2022杭电多校(一) 一.比赛小结 二.题目分析及解法(基础题) 1001.String 1002.Dragon slayer 1003.BackPack 1004 ...

  4. 杭电多校第六场个人补题6 7 9 10 12

    杭电多校第六场个人补题6 7 9 10 12 6 题意 给定一棵有n结点的树,点权为1~n,求对所有结点子树的mex操作和的最大值 思路 其实就是从最底部开始网上找,由于0是唯一的一个,所欲最好给在最 ...

  5. 2021杭电多校补题——第一场

    2021杭电多校补题--第一场 文章目录 Mod, Or and Everything Rocket land(待补) Puzzle loop(待补) Another thief in a Shop( ...

  6. 2022杭电多校(十)

    2022杭电多校(十) 文章目录 2022杭电多校(十) 一.比赛小结 二.题目分析及解法(基础题) 1001.Winner Prediction 1003.Wavy Tree 1004.Averag ...

  7. 2022杭电多校(二)

    2022杭电多校(二) 文章目录 2022杭电多校(二) 一.比赛小结 二.题目分析及解法(基础题) 1001.Static Query on Tree 1002.C++ to Python 1003 ...

  8. 2022杭电多校(五)

    2022杭电多校(五) 文章目录 2022杭电多校(五) 一.比赛小结 二.题目分析及解法(基础题) 1003.Slipper 1006.BBQ 1007.Count Set 1010.Braggin ...

  9. 2022杭电多校(三)

    2022杭电多校(三) 文章目录 2022杭电多校(三) 一.比赛小结 二.题目分析及解法(基础题) 1001.Equipment Upgrade 1002.Boss Rush 1003.Cyber ...

最新文章

  1. C语言网络编程:多路IO select实现多客户端
  2. python 光标位置输入文字_Python 移动光标位置的方法
  3. Windows环境下在IDEA编辑器中spark开发安装步骤
  4. 【Linux 内核】进程优先级与调度策略 ③ ( 设置、获取线程优先级的核心函数 | 修改线程调度策略函数 )
  5. python 知识点总结
  6. 读书印记 - 《创新者的解答》
  7. 程序员肚子越来越大_肚子越来越大,除了肥胖还可能是疾病信号!腰间搓一搓,排出痰浊,消脂防病~...
  8. Scala中class与object区别
  9. tree工具类 TreeUtils.java
  10. STM32之FSMC的液晶使用
  11. Qt UDP组播的应用
  12. 机器学习笔记 - 基于最简单的编码器/解码器架构SegNet进行语义分割
  13. php加密=>python解密或者python加密=>php解密
  14. 机器学习(六):特征降维和主成分分析法
  15. 创建zemax非序列光学系统
  16. 阿里云免费SSL证书申请详细流程
  17. php小写字母改成大写,php如何将小写字母转为大写
  18. google Map API实现地址解析
  19. 【MOOC】华中科技大学计算机组成原理慕课答案-第六章-中央处理器(一)
  20. 广东计算机复试英语翻译,广东考研指南:参加研究生复试,英语面试自我介绍技巧...

热门文章

  1. 视频开发技术安全保障措施
  2. 在安卓上部署服务器--ksweb+wordpress
  3. PHP项目部署在安卓服务器导出文件乱码问题(ksweb-mysql+php7+apache)
  4. day01 PySpark
  5. (转)如何使用Psyco为你的Python程序提速。
  6. 分别从中序、后续中组成二叉树(likou106)
  7. xshell启动的时候报initialize flexnet service failed error code 50003
  8. airflow error Flask-Appbuilder setp command
  9. Excel收纳箱:记录下如何通过VBA代码获取当前列
  10. iOS 多线程安全数组