HDU 6325 Interstellar Travel [돌출]
7680 단어 ACM_합숙 훈련ACM-데이터 구조
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
제목
평면 에는 n 개의 점 이 있 는데 1 부터 n 까지 번호 가 있 습 니 다. 지금 은 우주선 을 한 점 에서 다음 점 까지 운항 합 니 다.당신 의 모든 좌 표를 보 여 주 려 면 i 점 에서 j 점 까지 xi < xj 를 요구 해 야 합 니 다.우주선 이 소모 하 는 에 너 지 는 바로 xi * yj - xj * yi 로 소모 치 는 마이너스 가 될 수 있다.지금 은 첫 번 째 점 에서 n 번 째 점 까지 의 최소 소모 상황 에서 우주선 이 지나 간 점 의 번 호 를 출력 하고 사전 순서에 따라 배열 하 라 고 물 었 다.
문제 풀이 의 사고 방향.
문 제 를 보면 두 점 사이 의 차 승 을 구 할 수 있 고 소모 치 는 마이너스 일 수 있 기 때문에 우 리 는 돌출 가방 을 생각 하고 역 돌출 가방 을 만 들 수 있다. 그러면 돌출 가방 옆 에 있 는 점 은 차 승 과 작은 것 에 따라 사전 순서에 따라 출력 하면 된다.
코드 부분
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=2e5+7;
int qu[maxn],mn[maxn];///qu
struct node
{
int x,y,id;
bool operatorconst node &p)const///
{
if(x!=p.x) return xif(y!=p.y) return y>p.y;
return idint x,int y,int z)/// xi*yj-xj*yi
{
int ax=pt[y].x-pt[x].x;
int ay=pt[y].y-pt[x].y;
int bx=pt[z].x-pt[y].x;
int by=pt[z].y-pt[y].y;
return 1LL*ax*by-1LL*ay*bx;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&pt[i].x,&pt[i].y);
}
for(int i=1; i<=n; i++)
{
pt[i].id=i;///
}
sort(pt+1,pt+n+1);
int now=0;///
qu[0]=1;///
for(int i=2; i<=n; i++)///
{
if(pt[i].x==pt[i-1].x)
continue;
while(now&&get(qu[now-1],qu[now],i)>0)
now--;
qu[++now]=i;
}
int l=0,r;
printf("1");
while(lfor(r=l+1; r<=now; r++)
{
if(get(qu[l],qu[l+1],qu[r])!=0)///
break;
}
mn[r]=1e9;
for(int i=r-1; i>=l; i--)
{
mn[i]=min(pt[qu[i]].id,mn[i+1]);
}
for(int i=l+1; i<=r-1; i++)
{
if(mn[i]==pt[qu[i]].id)
printf(" %d",pt[qu[i]].id);
}
l=r-1;
}
cout<return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
husj ojF - Inversions Time Limit:500MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u Submit Status Description Ther...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.