日常卡输出格式^ ^
题目:https://vjudge.net/problem/UVA-1411
分治法,这个博客讲得听清楚的https://blog.csdn.net/mschessy/article/details/104566741/
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<map>
#include<unordered_map>
#include<unordered_set>
#include<set>
#include<stack>
#include<sstream>
using namespace std;
struct node {
int x, y, t, idx;
double angle;
bool operator < (const node & nd)const {
return y < nd.y ||(y == nd.y && x > nd.x);
}
void cal(node nd) {
angle = atan2(y - nd.y, x - nd.x);
}
}nd[205];
int n, ans[105];
bool cmp(node& i, node &j) {
return i.angle < j.angle;
}
void solve(int a,int b)
{
if (a >= b)
return;
sort(nd + a, nd + b);
for (int i = a; i < b; i++)
nd[i].cal(nd[a]);
sort(nd + a, nd + b, cmp);
int t1 = 0, t2 = 0;
for (int i = a; i < b; i++) {
if (nd[i].t == 0) t1++;
if (nd[i].t == 1) t2++;
if (t1 == t2) {
nd[i].t == 1 ? ans[nd[a].idx] = nd[i].idx : ans[nd[i].idx] = nd[a].idx;
solve(a + 1, i);
solve(i + 1, b);
return;
}
}
}
int main() {
while(cin >> n && n){
for (int i = 0; i < 2*n; i++) {
cin >> nd[i].x >> nd[i].y;
nd[i].t = (i >= n);
nd[i].idx = i % n;
}
solve(0, 2*n);
for (int i = 0; i < n; i++)
cout << ans[i]+1 << endl;
cout << endl;
}
return 0;
}