QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#132662 | #6744. Square | bucketpotato# | AC ✓ | 134ms | 3464kb | C++20 | 1.4kb | 2023-07-31 00:23:06 | 2023-07-31 00:23:08 |
Judging History
answer
#include "bits/stdc++.h"
using namespace std;
#define ll long long
#define ld long double
// #define DEBUG
#ifdef DEBUG
const int MAXN = 50;
int ta[MAXN];
#endif
__int128 comp(__int128 fv, __int128 cn, __int128 ss) {
__int128 ans = (cn * ss);
ans += (cn * (cn - 1)) / 2;
return ans + fv;
}
ll get(ll x) {
long double ss = sqrtl((long double)(x * 2));
ll mss = (ss + 1.5);
return mss;
}
ll solve(ll x, ll y) {
ll mss = get(x);
__int128 lo = 0, hi = 1000000000000ll;
while (lo != hi) {
__int128 avg = (lo + hi) / 2;
if (comp(x, avg, mss) >= (__int128)y) hi = avg;
else lo = avg + 1;
}
__int128 res = comp(x, lo, mss);
__int128 ans = lo + (res - y);
return ans;
}
ll maxv(ll x) {
ll lo = 1, hi = 1e18;
while (lo != hi) {
ll avg = (lo + hi + 1) / 2;
if (get(avg) > x) hi = avg - 1;
else lo = avg;
}
return lo;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin.exceptions(cin.failbit);
int t; cin >> t;
while (t--) {
ll x, y;
cin >> x >> y;
ll ans = solve(x, y);
if (x > 1 && y > x) {
ll mss = get(x);
ll msy = get(y);
ll df = maxv(msy) - y;
ll nch = maxv(mss - 1) - df;
if (nch > 0) {
ans = min(ans, solve(nch, y) + (x - nch));
}
}
cout << ((ll)ans) << "\n";
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3464kb
input:
2 5 1 1 5
output:
4 3
result:
ok 2 number(s): "4 3"
Test #2:
score: 0
Accepted
time: 134ms
memory: 3384kb
input:
100000 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 1 27 1 28 1 29 1 30 1 31 1 32 1 33 1 34 1 35 1 36 1 37 1 38 1 39 1 40 1 41 1 42 1 43 1 44 1 45 1 46 1 47 1 48 1 49 1 50 1 51 1 52 1 53 1 54 1 55 1 56 1 57 1 58 1 59 1 60 1 ...
output:
0 2 1 4 3 2 6 5 4 3 8 7 6 5 4 10 9 8 7 6 5 12 11 10 9 8 7 6 14 13 12 11 10 9 8 7 16 15 14 13 12 11 10 9 8 18 17 16 15 14 13 12 11 10 9 20 19 18 17 16 15 14 13 12 11 10 22 21 20 19 18 17 16 15 14 13 12 11 24 23 22 21 20 19 18 17 16 15 14 13 12 26 25 24 23 22 21 20 19 18 1 0 2 2 1 3 4 3 2 4 6 5 4 3 5 ...
result:
ok 100000 numbers