AcWing 1221. 四平方和
原题链接
简单
作者:
牛奶小柒Luke
,
2021-03-21 23:28:33
,
所有人可见
,
阅读 632
暴力穷举跟哈希map都会超时,故用二分方法来写
用结构体存放s = c * c + d * d,c,d确立区间[l,r]为s的取值范围
判断条件:s按从小到大的顺序排序,具有二段性
字典序排序,重载小于号
循环枚举a和b,二分是找到最小的大于等于n−a×a−b×b的数对,更新区间
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 25 * 1e6 + 10;
struct Sum{
int s,c,d;
bool operator< (const Sum &t)const
{
if(s != t.s) return s < t.s;
if(c != t.c) return c < t.c;
return d < t.d;
}
}sum[N];
int n,m;
int main(){
cin >> n;
for(int c = 0;c * c <= n;++c){
for(int d = c;c * c + d * d <= n;++d){
sum[m++] = {c * c + d * d,c,d};
}
}
sort(sum,sum + m);
for(int a = 0;a * a <= n;++a){
for(int b = a;a * a + b * b <= n;++b){
int t = n - a * a - b * b;
int l = 0,r = m - 1;
while(l < r){
int mid = l + r >> 1;
if(sum[mid].s >= t) r = mid;
else l = mid + 1;
}
if(sum[l].s == t){
printf("%d %d %d %d\n",a,b,sum[l].c,sum[l].d);
return 0;
}
}
}
return 0;
}