小HY的四元组
小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;
}
//:/


浙公网安备 33010602011771号