QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#599550 | #9427. Collect the Coins | ucup-team1766# | TL | 62ms | 4660kb | C++20 | 3.0kb | 2024-09-29 06:30:31 | 2024-09-29 06:30:32 |
Judging History
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