QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#399154#6744. SquareyeVegeTableAC ✓377ms3712kbC++202.4kb2024-04-25 23:21:452024-04-25 23:21:52

Judging History

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

  • [2024-04-25 23:21:52]
  • 评测
  • 测评结果:AC
  • 用时:377ms
  • 内存:3712kb
  • [2024-04-25 23:21:45]
  • 提交

answer

#include <bits/stdc++.h>
#include <chrono>
using namespace std;
#define endl '\n'
//#define inf 1e18
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 lll;
typedef pair<ll, ll> P;
#define x first
#define y second
#define int long long

// const int p = 1e9 + 7;
const int pp = 998244353;

int dx[8] = {-1, 0, 1, 0, -1, -1, 1, 1}, dy[8] = {0, 1, 0, -1, -1, 1, -1, 1};
int ddx[8] = {1, 1, 2, 2, -1, -1, -2, -2}, ddy[8] = {2, -2, 1, -1, 2, -2, 1, -1};

ll ksm(ll a, ll b, ll p) {
    ll ans = 1;
    while(b) {
        if(b & 1) ans = (ans * a) % p;
        b >>= 1;
        a = (a * a) % p;
    }
    return ans % p;
}

std::mt19937 rng;  // 随机数生成器  
int rand(int l, int r) {
    std::uniform_int_distribution<int> distribution(l, r);
    return distribution(rng);
}

int f(int x) {
    double y = sqrt(2 * x) + 1.5;
    return (int)y;
}

// int n = 20;
void work(int x) {
    cout << f(x) << endl;
}

int calc(int x) { // 求每个数字对应的起始首项,[1] : 2, [2,3] : 3, [4,5,6] : 4 ...
    int l = 1, r = 2e9;
    while(l < r) {
        int mid = (l + r) >> 1;
        if(mid * (mid + 1) / 2 < x) l = mid + 1;
        else r = mid;
    }
    return l + 1;
}

int get(int a, int b) {
    if(a > b) return a - b;
    int st = calc(a);
    int c = b - a;
    int l = 1, r = 2e9;
    while(l < r) {
        int mid = (l + r) >> 1;
        if((st + st + (mid - 1)) * mid / 2 + a >= b) r = mid;
        else l = mid + 1;
    }
    int sum = (st + st + (l - 1)) * l / 2 + a;
    int ans = l + (sum - b);
    return ans;
}

void solve() {
    int a, b;
    cin >> a >> b;
    if(a >= b) {
        cout << a - b << endl;
        return ;
    }
    int st = calc(a);
    // cout << "st : " << st << endl;
    int ans = get(a, b);
    if(a > 1) {
        int l = 1, r = a - 1;
        while(l < r) {
            int mid = (l + r + 1) >> 1;
            if(calc(mid) < st) l = mid;
            else r = mid - 1;
        }
        int now = get(l, b);
        // cout << "la : " << l << ", now : " << now << endl;
        ans = min(ans, now + a - l);
    }
    cout << ans << endl;
}


/*	



*/

signed main () {
    // init(minp, primes, m); // primes
    // ios::sync_with_stdio(0);
    // cin.tie(0), cout.tie(0);
    // init();
    int _ = 1;
  cin >> _;
    while(_ -- ) {
        solve();
    }
    return 0;
}

详细

Test #1:

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

input:

2
5 1
1 5

output:

4
3

result:

ok 2 number(s): "4 3"

Test #2:

score: 0
Accepted
time: 377ms
memory: 3596kb

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