HDU 6325 Problem G. Interstellar Travel(凸包)
题意:
给你n个点,第一个点一定是(0,0),最后一个点纵坐标yn一定是0,中间的点的横坐标一定都是在(0,xn)之间的
然后从第一个点开始飞行,每次飞到下一个点j,你花费的价值就是xi*yj-xj*yi,并且这里每一次飞行必须满足xi<xj
让你求出你所花费的最小的价值(可以为负)下,飞行的路径,如果有多种情况,输出路径字典序最小的那个
显然坐标相同的点里只保留编号最小的点最优。这里是因为题目严格要求xi<xj,所以不可能在原地飞行。
将起点到终点的路径补全为终点往下走到无穷远处,再往左走到起点正下方,再往上回到起点。任意路径中回到起点部分的代价相同,观察代价和的几何意义,就是走过部分的面积的相反数。代价和最小等价于面积最大,故一定是沿着上凸壳行走。
显然起点、终点、凸壳的拐点必须要作为降落点。对于共线的点a1,a2,...,am,若一个点ii的编号是[i,m]中最小的,那么在此处降落可以最小化字典序。
#include<bits/stdc++.h> using namespace std; const int mx = 2e5 + 10; typedef long long ll; int n,m,ans[mx],top,ma; struct node {int x,y;int pos; }s[mx],tubeg[mx],w; bool vis[mx]; ll judge(node p1,node p2,node p0)//面积公式判断正负值 {ll ans = 1ll*(p1.x-p0.x)*(p2.y-p0.y) - 1ll*(p2.x-p0.x)*(p1.y-p0.y);return ans; } bool cmp(node a,node b) {ll c = judge(w,b,a);//极角排序,同角度按距离从小到大排 if(b.x==a.x&&b.y==a.y) return a.pos > b.pos;if(!c) return pow(a.x-w.x,2)+pow(a.y-w.y,2) < pow(b.x-w.x,2)+pow(b.y-w.y,2);return c > 0; } void Graham() {tubeg[0] = s[0],tubeg[1] = s[1];top = 2;for(int i=2;i<n;i++){while(top>1&&judge(tubeg[top-2],s[i],tubeg[top-1])<=0){if(judge(tubeg[top-2],s[i],tubeg[top-1])<0||tubeg[top-1].pos>s[i].pos) top--;else break;}tubeg[top++] = s[i];}for(int i=0;i<top;i++) printf("%d%c",tubeg[i].pos+1,i==top-1?'\n':' '); } int main() {int t;scanf("%d",&t);while(t--){scanf("%d",&n);memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){scanf("%d%d",&s[i].x,&s[i].y);s[i].pos = i; }w = s[0];sort(s+1,s+n,cmp);Graham();}return 0; }
View Code
转载于:https://www.cnblogs.com/shuaihui520/p/10323080.html
HDU 6325 Problem G. Interstellar Travel(凸包)相关推荐
- 2018HDU多校训练-3-Problem G. Interstellar Travel
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6325 Interstellar Trav ...
- 2018 Multi-University Training Contest 3: G. Interstellar Travel(凸包)
题意:给你平面上n个点,第一个点一定在(0, 0),第n个点的y坐标一定为0,除此之外中间所有点的x坐标一定大于0且小于最后一个点的x坐标,你从一号点开始出发,中间从第i个点到第j个点必须满足xj&g ...
- 【杭电多校round3】G Interstellar Travel
题意 给定二维平面上的n个点,保证只有一个点(P_1)横坐标最小,一个点横坐标最大(P_n),在坐标轴上其余点无序且可能重合 即 y_1=y_n=0, 0=x_1<x_2,x_3,...,x_n ...
- Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem G. k-palindrome dp
Problem G. k-palindrome 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022 ...
- HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)
6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...
- Problem G. Pandaria(线段树合并 + Kruskal 重构树)
Problem G. Pandaria 给定一个有nnn条边的无向连通图,每条边有对应的边权,每个点有一个颜色, 问从一个点出发,经过不超过www的边权,所能到达的点中,颜色出现次数做多且颜色编号最小 ...
- Problem G: 函数---判断日期(年月日)是否合法
Problem G: 函数---判断日期(年月日)是否合法 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 566 Solved: 240 Descr ...
- Problem G: C语言习题 医生值班
Problem G: C语言习题 医生值班 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 847 Solved: 102 [Submit][Stat ...
- “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛Problem G: 蛤玮点菜
Problem G: 蛤玮点菜 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 320 Solved: 31 SubmitWeb Board Desc ...
最新文章
- 非常好用的网站状态监控服务:SiteUpTime,监控你的Http/Mail/Ping etc.
- fastjson异常问题
- 网络知识:秒懂你家的网络连接方式
- [html] HTML5的Server-Sent和WebSocket有什么区别?
- MemDC,GDI绘制注意点
- pythonの鉴黄之路(二)——图片转base64码
- CNN与Transformer结合,东南大学提出新架构 ConvTransformer
- php写else老是报错,调试PHP错误经常用到的一些
- 查看Linux版本命令
- python输出所有满足以下条件的3位整数_各位大佬帮帮忙吧 拜托了。求出所有符合下列条件的三位正整数:...
- 通过UltraISO,写入ISO镜像,制作U盘启动盘
- 小游戏学习--获取已发布微信小游戏源码 creator cocos 编译出微信平台代码 喵喵切水果 跑酷
- 机智云开源框架二次开发之换皮肤,几乎不用改代码
- 商家自研美团闪购开放平台SDK对接
- 超低功耗MCU 的网站
- word一键生成ppt 分页_PPT插入word自动分页
- [Algorithms] Gale-Shapley算法(婚姻匹配问题,高考录取机制)
- 计算机表格要学些什么,几个Excel表格的制作方法
- VUEPC和手机屏幕适配
- 如何处理java异常