QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#599588 | #9427. Collect the Coins | ucup-team2000# | TL | 37ms | 5628kb | C++23 | 3.0kb | 2024-09-29 06:55:33 | 2024-09-29 06:55:34 |
Judging History
answer
#include<bits/stdc++.h>
#pragma GCC optimize(3,"Ofast","inline")
// #pragma GCC target("avx2","sse2","fma")
using namespace std;
using ll = long long;
const int maxn = 1e6+100;
ll n;
pair<ll, ll>vec[maxn];
set<pair<ll, ll>>all;
set<ll>all_pos;
bool check(ll V) {
static bool dp[maxn];
fill(dp, dp + n + 1, 0);
all.clear();
auto valid = [&](ll i, ll j) {
auto [t1, p1] = vec[i];
auto [t2, p2] = vec[j];
return abs(p1-p2)<=abs(t1-t2)*V;
};
auto insert = [&](ll pos) {
auto [t, p] = vec[pos];
// insert (p - tV, -p-tV)
// ...
auto x = p - t*V;
auto y = -p - t*V;
bool flag = true;
auto rit = all.lower_bound({x, y});
if(rit==all.end()) flag = true;
else {
auto [tx, ty] = *rit;
if(ty<y) flag = true;
else flag = false;
}
if(flag) {
auto it = rit;
while(it != all.begin()) {
auto pit = prev(it, 1);
auto [tx, ty] = *pit;
if(ty<=y) all.erase(pit);
else break;
}
all.insert({x, y});
}
};
for(int i = 2 ; i < n ; i ++) {
if(!valid(i-1, i)) break;
dp[i+1] = true;
}
// check st = 2, i = 3?
dp[2] = true;
for(ll i = 3 ; i <= n ; i ++) {
if(!valid(i-2, i-1)) {
all.clear();
}
//cout << "addr2" << endl;
if(dp[i-1]) insert(i-2);
// j-1
auto [qt, qp] = vec[i];
auto qx = qp - qt * V;
auto qy = -qp - qt * V;
auto it = all.lower_bound({qx, qy});
if(it!=all.end()) {
auto [tx, ty] = *it;
if(ty>=qy) dp[i] = true;
}
//cout << "addr3" << endl;
//cout << i << ' ' << dp[i] << endl;
}
// cout << V << endl;
// exit(0);
for(int temp = n ; temp >= 1 ; temp --) {
if(temp<n and !valid(temp, temp+1)) break;
if(dp[temp]) return true;
}
return false;
};
void solve() {
cin >> n;
// n = 1000000;
for(ll i = 1 ; i <= n ; i ++) {
cin >> vec[i].first >> vec[i].second;
// vec[i].first = i;
// vec[i].second = i;
}
all_pos.clear();
for(ll i = 1 ; i <= n ; i ++) {
all_pos.insert(vec[i].second);
}
if(all_pos.size()<=2) {
cout << 0 << '\n';
return;
}
//cout << "addr1" << endl;
ll L = 1, R = 5e8+100;
while(L<R) {
ll mid = (L+R)/2;
if(check(mid)) R = mid;
else L = mid + 1;
//cout << "checking: " << L << ' ' << R << ' ' << check(mid) << endl;
}
if(L> 5e8) L = -1;
cout << L << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll t; cin >> t;
while(t--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 5628kb
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: 37ms
memory: 4304kb
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...