小HY的四元组
可爱的小HY在偶然间发现了一种等差四元组,我们定义四元祖为{(a,b,c,d)}四个数的有序集合。若对于(i,j(i<j))的四元组{(a_i,b_i,c_i,d_i)}和{(a_j,b_j,c_j,d_j)}存在(a_i-a_j=b_i-b_j=c_i-c_j=d_i-d_j)则称((i,j))为一对等差四元组。
小HY是个有特殊癖好的人,现在给出(n)个四元组,他想知道在所有等差四元组((i,j))中(j-i)的最小值和(i+j)的最大值。聪明的你能告诉他答案吗?Input
输入文件有(n+1)行,第一行为一个数(n),接下来输入(n)行,每行(a,b,c,d)四个整数。
Output
输出只有一行,包括(j-i)的最小值和(i+j)的最大值,中间有空格隔开,数据保证有解。
Example
输入 #1
(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
(1) (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
(2) (14)
Scoring
对于30%的数据(n<=1000)
对于100%的数据(n<=500000), (a,b,c,d)均在int范围内。
不是难题,但是依旧20分
这道题比赛时候脑子抽了...
先是预处理的时候一定要把最小值求出来,然后用四个数去减
然后不排序,搞了个map(憨
用了大概是哈希一样的办法,就是每个数减去min之后乘上一个什么什么质数再加起来放到map里
结果不仅WA还TLE
正解边看代码边理解吧
//感觉不用多讲,自己理解理解(真的有人看吗
#include<bits/stdc++.h>
using namespace std;
#define inf 500005
int n, minn = inf, maxn;
int a, b, c, d;
struct code {
int x, y, z;
int num;
} p[inf];
bool cmp(code x, code y) {
if (x.x != y.x) return x.x < y.x;
if (x.y != y.y) return x.y < y.y;
if (x.z != y.z) return x.z < y.z;
return x.num < y.num;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d %d %d %d", &a, &b, &c, &d);
p[i].x = b - a;
p[i].y = c - a;
p[i].z = d - a;//如果两个四元组中这三个值都一样,这俩就是等差四元组
p[i].num = i;
}
sort(p + 1, p + n + 1, cmp);
a = p[1].x, b = p[1].y, c = p[1].z;
for (int i = 2; i <= n; i++) {
if(p[i].x != a || p[i].y != b || p[i].z != c)
a = p[i].x, b = p[i].y, c = p[i].z;
else minn = min(minn, p[i].num - p[i - 1].num), maxn = max(maxn, p[i].num + p[i-1].num);
//因为j-i的最小值需要尽量靠近的,i+j的最大值需要尽量靠后的,所以答案的i与j一定在排序后相邻
}
printf("%d %d", minn, maxn);
return 0;
}
//:/