QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#129384#6744. SquareSolitaryDream#AC ✓31ms3704kbC++201.6kb2023-07-22 17:48:032023-07-22 17:48:07

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-07-22 17:48:07]
  • 评测
  • 测评结果:AC
  • 用时:31ms
  • 内存:3704kb
  • [2023-07-22 17:48:03]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int Sqr(int x) {
    return x * x;
}
inline int GetDelta(int x) {
    if (x == 0) return 1;
    if (x == 1) return 2;
    if (x == 2) return 3;
    int ans = sqrtl((long double)2 * x) + 1.5;
    // while (Sqr(2 * ans - 3) > 8 * x) --ans;
    ans -= 3;
    while (Sqr(2 * ans - 1) <= 8 * x) ++ans;
    return ans;
}
inline int Jump(int x, int k) {
    int delta = GetDelta(x);
    return x + (delta + delta + k - 1) * k / 2;
}
inline void Solve(int x, int y) {
    if (x >= y) { printf("%lld\n", x - y); return; }
    int delta = GetDelta(x);
    int k = -1;
    for (int l = 1, r = 1e10; l <= r; ) {
        int mid = (l + r) >> 1;
        if (x + (__int128)(delta + delta + mid - 1) * mid / 2 >= y) k = mid, r = mid - 1;
        else l = mid + 1;
    }
    int nx = Jump(x, k);
    if (GetDelta(nx) == GetDelta(y)) {
        printf("%lld\n", k + nx - y);
    } else {
        printf("%lld\n", GetDelta(x) - 1 - (y - Jump(x, k - 1)) + k);
    }
}
signed main() {
    // for (int i = 0; i <= 10000000; ++i) {
    //     int j = Jump(i, 1), k = Jump(j, 1);
    //     assert(j - i + 1 == k - j);
    // }
    // puts("ok");

    // int ans = 999999998585786438;
    // cout << Jump(ans, 1) << endl;
    // cout << GetDelta(5) << endl;
    // for (int i = 0; i <= 20; ++i) {
    //     cout << GetDelta(i) << ' ' << sqrt(2 * i) + 1.5 << endl;
    // }
    int Case;
    scanf("%lld", &Case);
    while (Case--) {
        int x, y;
        scanf("%lld%lld", &x, &y);
        Solve(x, y);
    }
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3656kb

input:

2
5 1
1 5

output:

4
3

result:

ok 2 number(s): "4 3"

Test #2:

score: 0
Accepted
time: 31ms
memory: 3704kb

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