Submission #920450

# Submission time Handle Problem Language Result Execution time Memory
920450 2024-02-02T14:49:15 Z hasuhasuiro Autobahn (COI21_autobahn) C++17
50 / 100
1000 ms 76596 KB
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, K;
    long long X;
    cin >> N >> K >> X;
    vector l(N, 0LL), r(N, 0LL), t(N, 0LL);
    for(int i = 0; i < N; i++) { cin >> l[i] >> t[i] >> r[i]; r[i]++; }
    if(N <= 1010 && X <= 1010 && *max_element(begin(l), end(l)) <= 1010 && *max_element(begin(r), end(r)) <= 1010 && *max_element(begin(t), end(t)) <= 1010) {
        vector imos1(1010, 0), imos2(1010, 0);
        for(int i = 0; i < N; i++) {
            imos1[l[i]]++, imos1[r[i]]--;
            if(l[i]+t[i] < r[i]) { imos2[l[i]+t[i]]++, imos2[r[i]]--; }
        }
        for(int i = 0; i < 1005; i++) {
            imos1[i+1] += imos1[i];
            imos2[i+1] += imos2[i];
        }
        for(int i = 0; i < 1005; i++) { if(imos1[i] < K) { imos2[i] = 0; } }
        int ans(0);
        for(int i = 0; i < 1005-X; i++) {
            int res(0);
            for(int j = 0; j < X; j++) {
                res += imos2[i+j];
            }
            ans = max(res, ans);
        }
        cout << ans << endl;
    }else {
        /* 座標圧縮用の座標 */
        vector P(0, 0LL);
        for(int i = 0; i < N; i++) { P.push_back(l[i]), P.push_back(r[i]); } /* 各区間の始点終点 */
        for(int i = 0; i < N; i++) { if(l[i]+t[i] < r[i]) { P.push_back(l[i]+t[i]); } } /* 追加料金のかかる区間の始点 */
        int sizep(size(P));
        for(int i = 0; i < sizep; i++) { P.push_back(P[i]+X), P.push_back(P[i]-X); } /* ある点から X の距離の点 */
        sort(begin(P), end(P));
        P.erase(unique(begin(P), end(P)), end(P));
    
        /* P の逆引きできるような連想配列 */
        map<long long, int> mp;
        for(int i = 0; i < (int)size(P); i++) { mp[P[i]] = i; }
        vector imos(size(P), 0);
        for(int i = 0; i < N; i++) { imos[mp[l[i]]]++; imos[mp[r[i]]]--; } /* 各区間の区間加算 */
        for(int i = 0; i+1 < (int)size(P); i++) { imos[i+1] += imos[i]; } /* 求解 */
    
        vector imos2(size(P), 0LL);
        for(int i = 0; i < N; i++) { if(l[i]+t[i] < r[i]) { imos2[mp[l[i]+t[i]]]++; imos2[mp[r[i]]]--; } } /* 追加料金の区間加算 */
        for(int i = 0; i+1 < (int)size(P); i++) { imos2[i+1] += imos2[i]; } /* 求解 */
        for(int i = 0; i < (int)size(P); i++) { if(imos[i] < K) { imos2[i] = 0; } } /* 許される場合は除外する */
    
        /* 尺取り法 */
        long long ans(0LL), res(0LL);
        for(int i = 0, j = 0; i+1 < (int)size(P); i++) {
            for(; j < (int)size(P); j++) {
                if(P[i]+X <= P[j]) { break; }
                else if(j+1 < (int)size(P)) { res += imos2[mp[P[j]]] * (long long)(P[j+1]-P[j]); } /* 右端を加算 */
            }
            ans = max(res, ans);
            res -= imos2[mp[P[i]]] * (long long)(P[i+1] - P[i]); /* 左端を加算 */
        }
        cout << ans << endl;
    }
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 544 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 344 KB Output is correct
7 Correct 1 ms 344 KB Output is correct
8 Correct 0 ms 600 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 0 ms 344 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 544 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 344 KB Output is correct
7 Correct 1 ms 344 KB Output is correct
8 Correct 0 ms 600 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 0 ms 344 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 344 KB Output is correct
15 Correct 1 ms 344 KB Output is correct
16 Correct 1 ms 344 KB Output is correct
17 Correct 1 ms 344 KB Output is correct
18 Correct 1 ms 348 KB Output is correct
19 Correct 1 ms 600 KB Output is correct
20 Correct 1 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 1 ms 544 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 344 KB Output is correct
7 Correct 1 ms 344 KB Output is correct
8 Correct 0 ms 600 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 0 ms 344 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 344 KB Output is correct
15 Correct 1 ms 344 KB Output is correct
16 Correct 1 ms 344 KB Output is correct
17 Correct 1 ms 344 KB Output is correct
18 Correct 1 ms 348 KB Output is correct
19 Correct 1 ms 600 KB Output is correct
20 Correct 1 ms 348 KB Output is correct
21 Execution timed out 1040 ms 76596 KB Time limit exceeded
22 Halted 0 ms 0 KB -