QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#599581#9427. Collect the Coinsucup-team2000#TL 97ms6320kbC++233.0kb2024-09-29 06:54:062024-09-29 06:54:07

Judging History

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

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

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 = 1e9+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> 1e9) 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: 5768kb

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: 97ms
memory: 6320kb

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:


result: