2018HDU多校训练-3-Problem G. Interstellar Travel
生活随笔
收集整理的這篇文章主要介紹了
2018HDU多校训练-3-Problem G. Interstellar Travel
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6325? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Interstellar Travel?
Little Q knows the position of n planets in space, labeled by 1 to n . To his surprise, these planets are all coplanar. So to simplify, Little Q put these n planets on a plane coordinate system, and calculated the coordinate of each planet (xi,yi) .
Little Q plans to start his journey at the 1 -th planet, and end at the n -th planet. When he is at the i -th planet, he can next fly to the j -th planet only if xi<xj , which will cost his spaceship xi×yj?xj×yi units of energy. Note that this cost can be negative, it means the flight will supply his spaceship.
Please write a program to help Little Q find the best route with minimum total cost.
In each test case, there is an integer n(2≤n≤200000) in the first line, denoting the number of planets.
For the next n lines, each line contains 2 integers xi,yi(0≤xi,yi≤109) , denoting the coordinate of the i -th planet. Note that different planets may have the same coordinate because they are too close to each other. It is guaranteed that y1=yn=0,0=x1<x2,x3,...,xn?1<xn .
A sequence of integers a is lexicographically smaller than a sequence of b if there exists such index j that ai=bi for all i<j , but aj<bj .
Sample Input 1 3 0 0 3 0 4 0 Sample Output 1 2 3 Source 2018 Multi-University Training Contest 3 Recommend chendu 題解:WA了無數(shù)發(fā),忘了一句話,“有的星球由于太近可以認(rèn)為坐標(biāo)相同,但輸出的時(shí)候應(yīng)該輸出編號小的”,后來重讀了題目,家里個(gè)條件就過了;? 這個(gè)題目可以轉(zhuǎn)化為凸包問題,只求上凸包,求上凸包時(shí)注意排除橫坐標(biāo)相同的點(diǎn),只取縱坐標(biāo)大的點(diǎn),重要的一點(diǎn):對于縱坐標(biāo)相同而橫坐標(biāo)不同的點(diǎn),我們需要判斷中間點(diǎn)的編號是否比下一個(gè)點(diǎn)大,因?yàn)榘醋值湫蜉敵?#xff0c;故如果大于則去掉該點(diǎn),小于等于則保留,注意細(xì)節(jié); 參考代碼:
Problem Description After trying hard for many years, Little Q has finally received an astronaut license. To celebrate the fact, he intends to buy himself a spaceship and make an interstellar travel.
Little Q knows the position of n planets in space, labeled by 1 to n . To his surprise, these planets are all coplanar. So to simplify, Little Q put these n planets on a plane coordinate system, and calculated the coordinate of each planet (xi,yi) .
Little Q plans to start his journey at the 1 -th planet, and end at the n -th planet. When he is at the i -th planet, he can next fly to the j -th planet only if xi<xj , which will cost his spaceship xi×yj?xj×yi units of energy. Note that this cost can be negative, it means the flight will supply his spaceship.
Please write a program to help Little Q find the best route with minimum total cost.
?
Input The first line of the input contains an integer T(1≤T≤10) , denoting the number of test cases.In each test case, there is an integer n(2≤n≤200000) in the first line, denoting the number of planets.
For the next n lines, each line contains 2 integers xi,yi(0≤xi,yi≤109) , denoting the coordinate of the i -th planet. Note that different planets may have the same coordinate because they are too close to each other. It is guaranteed that y1=yn=0,0=x1<x2,x3,...,xn?1<xn .
?
Output For each test case, print a single line containing several distinct integers p1,p2,...,pm(1≤pi≤n) , denoting the route you chosen is p1→p2→...→pm?1→pm . Obviously p1 should be 1 and pm should be n . You should choose the route with minimum total cost. If there are multiple best routes, please choose the one with the smallest lexicographically.A sequence of integers a is lexicographically smaller than a sequence of b if there exists such index j that ai=bi for all i<j , but aj<bj .
Sample Input 1 3 0 0 3 0 4 0 Sample Output 1 2 3 Source 2018 Multi-University Training Contest 3 Recommend chendu 題解:WA了無數(shù)發(fā),忘了一句話,“有的星球由于太近可以認(rèn)為坐標(biāo)相同,但輸出的時(shí)候應(yīng)該輸出編號小的”,后來重讀了題目,家里個(gè)條件就過了;? 這個(gè)題目可以轉(zhuǎn)化為凸包問題,只求上凸包,求上凸包時(shí)注意排除橫坐標(biāo)相同的點(diǎn),只取縱坐標(biāo)大的點(diǎn),重要的一點(diǎn):對于縱坐標(biāo)相同而橫坐標(biāo)不同的點(diǎn),我們需要判斷中間點(diǎn)的編號是否比下一個(gè)點(diǎn)大,因?yàn)榘醋值湫蜉敵?#xff0c;故如果大于則去掉該點(diǎn),小于等于則保留,注意細(xì)節(jié); 參考代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=2e5+10;
LL vis[maxn],T,n;
LL num[maxn];
struct Point{LL x,y;LL id;Point(double xx=0,double yy=0) : x(xx),y(yy) {}
} p[maxn],ch[maxn];
typedef Point Vector;
Vector operator + (Vector a,Vector b) { return Vector(a.x+b.x,a.y+b.y); }
Vector operator - (Vector a,Vector b) { return Vector(a.x-b.x,a.y-b.y); }
Vector operator * (Vector a,Vector b) { return Vector(a.x*b.x,a.y*b.y); }
Vector operator / (Vector a,Vector b) { return Vector(a.x/b.x,a.y/b.y); }
bool operator < (const Point &a,const Point &b){ return a.x==b.x? (a.y==b.y? a.id<b.id : a.y>b.y) : a.x<b.x ; }
LL Cross(Vector a,Vector b) { return a.x*b.y-a.y*b.x; }void ConvexHull()
{LL m=0; memset(vis,0,sizeof vis);for(int i=1;i<=n;i++){if(i>1 && p[i].x == p[i-1].x) continue;while(m>1 && Cross(ch[m]-ch[m-1],p[i]-ch[m])>0) m--;ch[++m]=p[i];}vis[1]=vis[m]=1;for(int i=2;i<m;i++) if(Cross(ch[i+1]-ch[i],ch[i]-ch[i-1])!=0) vis[i]=1;for(int i=m;i>0;i--){if(vis[i]) num[i]=ch[i].id;else num[i]=min(num[i+1],ch[i].id);}for(int i=1;i<m;i++) if(num[i]==ch[i].id) printf("%lld ",num[i]);printf("%lld\n",num[m]);
}int main()
{scanf("%lld",&T);while(T--){scanf("%lld",&n);for(int i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].y),p[i].id=i;sort(p+1,p+n+1);ConvexHull();}return 0;
}
轉(zhuǎn)載于:https://www.cnblogs.com/songorz/p/9398507.html
總結(jié)
以上是生活随笔為你收集整理的2018HDU多校训练-3-Problem G. Interstellar Travel的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 天才医仙是谁画的啊?
- 下一篇: 奔驰S320报价是多少?目前值得入手么?