ACM-ICPC 亚洲区 区域赛 香港赛区
只需要特判前两个和后两个操作就好(如果有的话)
因为可选的 lcm 次数大于1 以后就可以通过一个 取lcm 找到最大的两个2 3 的幂次,
同理,gcd 也可以找到两个小的 2 3的幂次
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
using namespace std;
const int maxn = 500000 + 7;
int n;
struct node
{
int x, y;
} a[maxn];
bool cmp(node a, node b)
{
return ( log(2) * a.x + log(3) * a.y) < (log(2) * b.x + log(3) * b.y);
}
int main()
{
int n;
int l1,l2;
int r1,r2;
l1 = l2 = 1000;
r1 = r2 = 0;
scanf("%d",&n);
for(int i = 1; i <= n; ++i)
{
scanf("%d %d", &a[i].x, &a[i].y);
l1 = min(l1,a[i].x);
l2 = min(l2,a[i].y);
r1 = max(r1,a[i].x);
r2 = max(r2,a[i].y);
}
sort(a+1, a+n+1, cmp);
if(n == 1)
cout<<r1<<" "<<r2<<" "<<r1<<" "<<r2<<endl;
else if(n == 2)
{
cout<<r1<<" "<<r2<<" "<<r1<<" "<<r2<<endl;
cout<<l1<<" "<<l2<<" "<<l1<<" "<<l2<<endl;
}
else
{
for(int i = 1; i <= n; i++)
{
if(i == n)
cout<<l1<<" "<<l2<<" ";
else if(i == n-1)
cout<<a[n].x<<" "<<a[n].y<<" ";
else
cout<<r1<<" "<<r2<<" ";
if(i == 1)
cout<<r1<<" "<<r2<<endl;
else if(i == 2)
cout<<a[1].x<<" "<<a[1].y<<endl;
else
cout<<l1<<" "<<l2<<endl;
}
}
return 0;
}