可爱的小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范围内。
#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; }