QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#599550#9427. Collect the Coinsucup-team1766#TL 62ms4660kbC++203.0kb2024-09-29 06:30:312024-09-29 06:30:32

Judging History

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

  • [2024-11-06 15:56:27]
  • hack成功,自动添加数据
  • (/hack/1139)
  • [2024-09-29 06:30:32]
  • 评测
  • 测评结果:TL
  • 用时:62ms
  • 内存:4660kb
  • [2024-09-29 06:30:31]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

const long long MAXC = 1000000005;

bool can_reach(long long l, long long r, long long target, long long v, long long dt) {
    if (target >= l && target <= r) {
        return true;
    }
    if (target < l) {
        return v * dt >= l - target;
    } else {
        return v * dt >= target - r;
    }
}

bool works(map<int, vector<int>> &events, long long v) {
    bool possible = true;
    long long prev = 0;
    long long l = 0;
    long long r = MAXC;
    long long fixed = -1;
    for (auto [t, pos] : events) {
        if (pos.size() > 2) {
            possible = false;
            break;
        }
        if (fixed == -1) {
            if (pos.size() == 1) {
                fixed = pos[0];
            } else {
                fixed = pos[0];
                l = pos[1];
                r = pos[1];
            }
        } else if (pos.size() == 2) {
            if ((can_reach(fixed, fixed, pos[0], v, t - prev) && can_reach(l, r, pos[1], v, t - prev)) ||
                (can_reach(fixed, fixed, pos[1], v, t - prev) && can_reach(l, r, pos[0], v, t - prev))) {
                fixed = pos[0];
                l = pos[1];
                r = pos[1];
            } else {
                possible = false;
                break;
            }
        } else {
            bool range_reach = can_reach(l, r, pos[0], v, t - prev);
            bool point_reach = can_reach(fixed, fixed, pos[0], v, t - prev);
            if (range_reach && !point_reach) {
                l = max((long long) 0, fixed - v * (t - prev));
                r = min(MAXC, fixed + v * (t - prev)); 
                fixed = pos[0];
            } else if (!range_reach && point_reach) {
                l = max((long long) 0, l - v * (t - prev));
                r = min(MAXC, r + v * (t - prev));
                fixed = pos[0];
            } else if (range_reach && point_reach) {
                long long newl = max((long long) 0, min(l - v * (t - prev), fixed - v * (t - prev)));
                long long newr = min(MAXC, max(r + v * (t - prev), fixed + v * (t - prev)));
                l = newl;
                r = newr;
                fixed = pos[0];
            } else {
                possible = false;
                break;
            }
        }
        prev = t;
    }
    return possible;
}

void solve() {
    int n;
    cin >> n;
    map<int, vector<int>> events;
    for (int i = 0; i < n; i++) {
        int t, c;
        cin >> t >> c;
        events[t].push_back(c);
    }

    long long l = 0;
    long long r = MAXC;
    long long res = -1;
    while (l <= r) {
        long long m = (l + r) / 2;
        if (works(events, m)) {
            res = m;
            r = m - 1;
        } else {
            l = m + 1;
        }
    }
    cout << res << "\n";
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int t;
    cin >> t;
    while (t--) {
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3584kb

input:

3
5
1 1
3 7
3 4
4 3
5 10
1
10 100
3
10 100
10 1000
10 10000

output:

2
0
-1

result:

ok 3 lines

Test #2:

score: 0
Accepted
time: 62ms
memory: 4660kb

input:

1135
2
6 5
8 8
8
2 9
2 10
4 4
5 3
6 2
6 8
8 2
8 7
1
9 1
6
4 6
6 1
6 2
9 10
10 1
10 7
5
1 6
2 5
6 7
8 6
10 3
8
1 10
5 4
5 7
6 1
6 6
8 4
9 1
9 4
8
1 1
1 3
2 9
3 3
5 9
6 10
9 7
10 7
3
5 8
6 6
10 6
7
2 9
4 7
5 10
6 3
6 7
8 9
10 1
6
1 4
2 8
5 9
7 10
9 1
10 5
9
2 7
4 5
5 9
6 10
7 4
9 4
9 9
10 3
10 7
1
3 1...

output:

0
3
0
3
1
3
6
0
3
2
2
0
2
5
0
1
5
1
2
0
0
0
1
4
2
0
2
1
3
0
3
2
3
2
5
3
1
1
0
1
1
1
0
2
0
1
0
1
0
2
1
0
2
3
4
4
1
1
1
0
1
3
0
1
4
4
3
0
0
2
2
6
4
2
1
0
0
1
0
2
1
2
0
1
1
3
0
0
1
2
0
3
0
2
2
2
1
0
0
0
5
1
2
0
6
1
1
1
2
2
2
0
3
1
4
3
6
0
8
1
1
3
0
2
2
4
1
1
0
0
0
7
2
2
1
0
0
3
1
2
1
1
2
5
3
0
3
3
3
5
...

result:

ok 1135 lines

Test #3:

score: -100
Time Limit Exceeded

input:

1
1000000
2 57841
2 357142
3 496329
3 545446
4 503408
4 590762
5 78281
6 196926
6 349414
7 200245
8 953412
11 616898
12 592065
13 945945
15 20908
15 852722
16 221184
16 401521
17 884478
18 186072
18 931445
19 833560
20 314177
21 138453
21 731965
22 172104
23 595921
25 372617
27 545759
28 977029
30 4...

output:

994024

result: