小HY的四元组

题目描述

可爱的小HY在偶然间发现了一种等差四元组,我们定义四元祖为{a,b,c,d}四个数的有序集合。若对于i,j(i<j)的四元组{ai,bi,ci,di}和{aj,bj,cj,dj}存在ai-aj=bi-bj=ci-cj=di-dj则称(i,j)为一对等差四元组。

   小HY是个有特殊癖好的人,现在给出n个四元组,他想知道在所有等差四元组(i,j)中j-i的最小值和i+j的最大值。聪明的你能告诉他答案吗?

输入

输入文件名为four.in

输入文件有n+1行,第一行为一个数n,接下来输入n行,每行a,b,c,d四个整数。

输出

输出文件名为four.out

输出只有一行,包括j-i的最小值和i+j的最大值,中间有空格隔开,数据保证有解

样例输入

 7 1 2 3 4 2 3 4 5 1 4 3 3 5 2 3 5 2 4 5 6 1 4 3 3 2 5 4 4

样例输出

1 13

提示

 (1,2,3,4)和(2,3,4,5)或(1,4,3,3)和(2,5,4,4)构成最小值。


 (1,4,3,3)和(2,5,4,4),6+7=13为最大值。


【输入输出样例2】


 10


 1 4 3 2


 4 4 4 4


 2 3 4 5


 1 1 1 1


 1 2 3 1


 3 4 2 1


 2 4 5 2


 8 9 7 6


 0 0 0 0


 1 2 3 4


 2 14


【数据说明】


   对于30%的数据n<=1000


   对于100%的数据n<=500000,a,b,c,d均在int范围内。

lwq12138大爷出的题
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,minv,maxv;
long long x,y,z,t;
struct ty
{
    long long a,b,c;
    int id;
}p[500005];
bool cmp(ty x,ty y)
{
    if(x.a!=y.a) return x.a<y.a;
    if(x.b!=y.b) return x.b<y.b;
    if(x.c!=y.c) return x.c<y.c;
    return x.id<y.id;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) 
    {
        scanf("%lld%lld%lld%lld",&x,&y,&z,&t);
        p[i].a=y-x;
        p[i].b=z-y;
        p[i].c=t-z;
        p[i].id=i;
    }
    sort(p+1,p+n+1,cmp);
    x=p[1].a;
    y=p[1].b;
    z=p[1].c;
    minv=1000000000;
    for(int i=2;i<=n;i++) 
    if(p[i].a!=x||p[i].b!=y||p[i].c!=z) 
    {
        x=p[i].a;
        y=p[i].b;
        z=p[i].c;
    }
    else
    {
        minv=min(minv,p[i].id-p[i-1].id);
        maxv=max(maxv,p[i].id+p[i-1].id);
    }
    cout<<minv<<' '<<maxv<<endl;
    return 0;
}





你可能感兴趣的:(小HY的四元组)