题意:给你平面上n个点,第一个点一定在(0, 0),第n个点的y坐标一定为0,除此之外中间所有点的x坐标一定大于0且小于最后一个点的x坐标,你从一号点开始出发,中间从第i个点到第j个点必须满足xj>xi,会消耗xi*yj-xj*yi点能量,这个值可以为负,为负相当于获得能量,求出一条字典序最小的路径,满足从1出发,终点为n,消耗的能量最少(或者获得的能量最多)

  • 首先这道题肯定不用消耗能量的,因为你最坏情况下从1直接到n
  • 可以发现式子xi*yj-xj*yi其实就是两个向量(x1, y1), (x2, y2)的叉积,而叉积正是两个向量构成的平行四边形面积
  • 接上,如果向量(x2, y2)在向量(x1, y1)的下面,那么贡献就为正(相当于获得能量),否则为负
  • 知道这点后,你就会发现当且仅当走出一个凸包时,获得的能量是最多的,正好等于凸包的面积
  • 所以这题就是求一下凸包就行了,所有在凸包上的点,就是你依次要经过的点

可是并没有这么简单,因为题目还要求字典序最小,比如下面这种情况(每个数字代表点的编号):

  • 其中1,2,4,7是必经点,3,5,6于可走可不走的,剩下的在凸包内部的点全部不能走
  • 这样就有不止一种走法了,其中字典序最小的走法为:0 2 4 5 7
  • 所以还要再贪心一下
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
#include<string.h>
#include<deque>
#include<algorithm>
using namespace std;
#define LL long long
typedef struct
{LL x, y;LL id;
}Point;
LL n, temp, net[200005], Min[200005], ans[200005];
Point top2, top1, s[200005];
deque<Point> q;
bool comp2(Point a, Point b)    /*按幅角排序*/
{if(a.x*b.y-a.y*b.x>0)return 1;else if(a.x*b.y-a.y*b.x==0 && a.x>b.x || a.x*b.y-a.y*b.x==0 && a.x==b.x && a.id<b.id)return 1;return 0;
}
int main(void)
{LL T, cnt, i, now, p;scanf("%lld", &T);while(T--){scanf("%lld", &n);p = n;memset(net, 0, sizeof(net));for(i=1;i<=n;i++){scanf("%lld%lld", &s[i].x, &s[i].y);Min[i] = i;s[i].id = i;}sort(s+1, s+n+1, comp2);cnt = 0;for(i=1;i<=n;i++){if(s[i].x==s[i-1].x && s[i].y==s[i-1].y)continue;s[++cnt] = s[i];}n = cnt;q.push_back(s[1]);q.push_back(s[2]);temp = 3;while(temp<=n){top1 = q.back();q.pop_back();if(q.empty()){q.push_back(top1);q.push_back(s[temp]);temp++;continue;}top2 = q.back();if((top2.x-top1.x)*(s[temp].y-top1.y)-(top2.y-top1.y)*(s[temp].x-top1.x)<=0){if((top2.x-top1.x)*(s[temp].y-top1.y)-(top2.y-top1.y)*(s[temp].x-top1.x)<0){q.push_back(top1);q.push_back(s[temp]);temp++;}else{net[s[temp].id] = top1.id;Min[s[temp].id] = min(s[temp].id, Min[top1.id]);q.push_back(s[temp]);temp++;}}}cnt = 0;while(q.empty()==0){top1 = q.back();ans[++cnt] = top1.id;q.pop_back();}for(i=1;i<=cnt-1;i++){printf("%lld ", ans[i]);now = net[ans[i]];while(now){if(Min[now]>ans[i+1])break;else if(Min[now]==now)printf("%lld ", now);now = net[now];}}printf("%lld\n", p);}return 0;
}

2018 Multi-University Training Contest 3: G. Interstellar Travel(凸包)相关推荐

  1. HDU 6325 Problem G. Interstellar Travel(凸包)

    题意: 给你n个点,第一个点一定是(0,0),最后一个点纵坐标yn一定是0,中间的点的横坐标一定都是在(0,xn)之间的 然后从第一个点开始飞行,每次飞到下一个点j,你花费的价值就是xi*yj-xj* ...

  2. 2018HDU多校训练-3-Problem G. Interstellar Travel

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6325                                  Interstellar Trav ...

  3. 【杭电多校round3】G Interstellar Travel

    题意 给定二维平面上的n个点,保证只有一个点(P_1)横坐标最小,一个点横坐标最大(P_n),在坐标轴上其余点无序且可能重合 即 y_1=y_n=0, 0=x_1<x_2,x_3,...,x_n ...

  4. 2018 Multi-University Training Contest 3

    好像克拉丽丝小姐姐题解写的超详细我都没啥好说的了 Problem A. Ascending Rating 仔细一看m是固定的单调DQ就好了 1 #include <bits/stdc++.h&g ...

  5. Sichuan University Programming Contest 2018 Preliminary

    嗯为了防止大家AK,所以这次的A题和K题我们就当做不存在好了! 经历了昨天写了两个多小时的博客没保存的心态炸裂,今天终于下了个Markdown.所以我猜这篇的格式应该会更好看一点! 好吧废话不多说 题 ...

  6. 2021 HZNU Winter Training Day 17 (2018 German Collegiate Programming Contest (GCPC 18))

    2021 HZNU Winter Training Day 17 (2018 German Collegiate Programming Contest (GCPC 18)) 题目 A B C D E ...

  7. 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6324 Problem F. Grab The Tree Time Limit: 2000/1000 MS ...

  8. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...

  9. 2018 Multi-University Training Contest 7 Age of Moyu

    Age of Moyu 来追梦 Problem Description Mr.Quin love fishes so much and Mr.Quin's city has a nautical sy ...

最新文章

  1. ASP.NET2.0中的ClientScriptManager 类用法—如何添加客户端事件!
  2. 推荐一款神级 API 接口管理神器
  3. 好惨!程序员修电脑遇到了人生滑铁卢 | 每日趣闻
  4. python3 issubset 判断列表子集
  5. 数据结构(五)位图算法
  6. CCF真题 201312-2 ISBN号码
  7. 生物科研神器!30分钟把人家一天的工作都给干完了!
  8. 《程序员修炼之道(第2版)》!屹立20年王者归来!
  9. 苹果明年有望推出15英寸版MacBook Air
  10. 如何调换antd中Modal对话框确认按钮和取消按钮两个按钮的位置
  11. 一份完整的建模文档需涵盖的模块与指标
  12. 通俗易懂的monteCarlo积分方法(八)
  13. android刷步工具,公益步数刷步助手
  14. 爬取虎嗅 5 万篇文章告诉你怎么样取标题
  15. 单片机应用系统设计技术——基于51单片机篮球计时计分器的设计
  16. 东望时代(原中国建筑第一股浙江广厦),将换域名,升级官网为数字化网站
  17. 【2017 BSUIR Semifinal G】Digital characteristic 题解
  18. 微机原理-汇编语言设计
  19. 智慧城市/数字政府/城市大脑
  20. manjaro安装mpv

热门文章

  1. python利器-[python] bluepy 一款python封装的BLE利器
  2. python怎么画简单图-python绘制简单彩虹图
  3. 全球硬科技开发者大会(成都)开幕 蓝光发展等超300名开发者「乘风」数字升级...
  4. 消费者生产者代码之---一步一步带你写
  5. oracle11g日志分析,Oracle11g在Windows环境下监听日志文件达到4G问题解决方案
  6. 调用Mutation函数的方式
  7. 视频帧率对人眼主观感受的影响 2
  8. 计算机一级b必背知识点,全国计算机等级考试B经典必考资料_知识点总结.doc
  9. 2个表 遍历 组合_7.2 图的存储结构(2)
  10. 404 单页应用 报错 路由_单页应用