第二种二分方式已经被注释, 第一种二分方式可以AC
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 5000010;
struct Num{
int c, d, s;
bool operator< (const Num &t)const
{
if(s != t.s) return s < t.s;
if(c != t.c) return c < t.c;
return d < t.d;
}
}num[N];
int n, m;
int main()
{
cin >> n;
for(int i = 0; i * i <= n; i ++)
for(int j = i; i * i + j * j <= n; j ++)
num[m ++] = {i, j, i * i + j * j};
sort(num, num + m);
for(int i = 0; i * i <= n; i ++)
for(int j = 0; i * i + j * j <= n; j ++)
{
int t = n - i * i - j * j;
int l = 0, r = m - 1;
while (l < r)
{
int mid = l + r >> 1;
if (num[mid].s >= t) r = mid;
else l = mid + 1;
}
// while (l < r)
// {
// int mid = l + r + 1 >> 1;
// if (num[mid].s <= t) l = mid;
// else r = mid - 1;
// }
if(t == num[l].s)
{
cout << i << ' ' << j << ' ' << num[l].c << ' ' << num[l].d << endl;
return 0;
}
}
}