답안 #787334

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
787334 2023-07-19T05:44:36 Z 이동현(#10034) 도로 건설 사업 (JOI13_construction) C++17
100 / 100
685 ms 101380 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#define int long long
using namespace std;

struct Data{
    int x, y, ey, id;

    Data(){}
    Data(int x, int y, int ey, int id):x(x), y(y), ey(ey), id(id){}

    bool operator<(const Data&r)const{
        return x < r.x;
    }
};

struct Dsu{
    int n;
    vector<int> pr;
    Dsu(int m){
        n = m + 4;
        pr.resize(n);
        iota(pr.begin(), pr.end(), 0);
    }
    int fd(int x){
        return (x == pr[x] ? x : pr[x] = fd(pr[x]));
    }
    bool unite(int x, int y){
        x = fd(x), y = fd(y);
        if(x == y) return false;
        pr[y] = x;
        return true;
    }
};

struct Fenwick{
    int n;
    vector<int> tr;
    Fenwick(int m){
        n = m + 4;
        tr.resize(n);
    }

    void push(int pos, int val){
        ++pos;
        for(int i = pos; i < n; i += (i & -i)){
            tr[i] += val;
        }
    }

    int get(int pos){
        ++pos;
        int rv = 0;
        for(int i = pos; i > 0; i -= (i & -i)){
            rv += tr[i];
        }

        return rv;
    }
};

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int n, m, c;
    cin >> n >> m >> c;

    vector<vector<int>> a(n, vector<int>(2)), b(m, vector<int>(4));
    for(int i = 0; i < n; ++i){
        cin >> a[i][0] >> a[i][1];
    }
    for(int i = 0; i < m; ++i){
        cin >> b[i][0] >> b[i][1] >> b[i][2] >> b[i][3];
    }

    vector<vector<int>> way;
    auto makeway = [&](){
        vector<int> srt;
        for(int i = 0; i < n; ++i){
            srt.push_back(a[i][1]);
        }
        for(int i = 0; i < m; ++i){
            srt.push_back(b[i][1]);
            srt.push_back(b[i][3]);
        }
        sort(srt.begin(), srt.end());
        srt.erase(unique(srt.begin(), srt.end()), srt.end());
        for(int i = 0; i < n; ++i){
            a[i][1] = lower_bound(srt.begin(), srt.end(), a[i][1]) - srt.begin();
        }
        for(int i = 0; i < m; ++i){
            b[i][1] = lower_bound(srt.begin(), srt.end(), b[i][1]) - srt.begin();
            b[i][3] = lower_bound(srt.begin(), srt.end(), b[i][3]) - srt.begin();
        }

        vector<Data> que;
        for(int i = 0; i < n; ++i){
            que.push_back(Data(a[i][0], a[i][1], -1, i));
        }
        for(int i = 0; i < m; ++i){
            que.push_back(Data(b[i][0], b[i][1], b[i][3], 1));
        }

        sort(que.begin(), que.end());
        Fenwick tr((int)srt.size());
        vector<int> lst((int)srt.size(), -1), val((int)srt.size());
        for(int i = 0; i < (int)que.size(); ++i){
            if(que[i].ey == -1){
                if(lst[que[i].y] != -1 && tr.get(que[i].y) == val[que[i].y]){
                    way.push_back({que[i].x - que[lst[que[i].y]].x, que[i].id, que[lst[que[i].y]].id});
                }
                lst[que[i].y] = i;
                val[que[i].y] = tr.get(que[i].y);
            }
            else{
                // cout << "LINE " << que[i].x << ' ' << que[i].y << ' ' << que[i].ey + 1 << endl;
                tr.push(que[i].y, que[i].id);
                tr.push(que[i].ey + 1, -que[i].id);
            }
        }

        for(int i = 0; i < n; ++i){
            a[i][1] = srt[a[i][1]];
        }
        for(int i = 0; i < m; ++i){
            b[i][1] = srt[b[i][1]];
            b[i][3] = srt[b[i][3]];
        }
    };

    makeway();
    for(int i = 0; i < n; ++i){
        swap(a[i][0], a[i][1]);
    }
    for(int i = 0; i < m; ++i){
        swap(b[i][0], b[i][1]);
        swap(b[i][2], b[i][3]);
    }
    makeway();

    sort(way.begin(), way.end());

    // for(auto&i:way){
    //     cout << i[0] << ' ' << i[1] << ' ' << i[2] << endl;
    // }
    
    Dsu gr(n);
    vector<int> cost, pre;
    for(int i = 0; i < (int)way.size(); ++i){
        if(gr.unite(way[i][1], way[i][2])){
            pre.push_back(((int)pre.size() ? pre.back() : 0) + way[i][0]);
            cost.push_back(way[i][0]);
        }
    }

    while(c--){
        int x, y;
        cin >> x >> y;

        y = n - y;

        if(y > (int)cost.size()){
            cout << "-1\n";
            
            continue;
        }

        int pos = lower_bound(cost.begin(), cost.end(), x) - cost.begin();
        pos = max(pos, y);
        cout << (pos ? pre[pos - 1] : 0ll) + (n - pos) * x << '\n';
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 1944 KB Output is correct
2 Correct 206 ms 31256 KB Output is correct
3 Correct 206 ms 31060 KB Output is correct
4 Correct 275 ms 46040 KB Output is correct
5 Correct 229 ms 39300 KB Output is correct
6 Correct 198 ms 31348 KB Output is correct
7 Correct 193 ms 46384 KB Output is correct
8 Correct 181 ms 38792 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 1944 KB Output is correct
2 Correct 206 ms 31256 KB Output is correct
3 Correct 206 ms 31060 KB Output is correct
4 Correct 275 ms 46040 KB Output is correct
5 Correct 229 ms 39300 KB Output is correct
6 Correct 198 ms 31348 KB Output is correct
7 Correct 193 ms 46384 KB Output is correct
8 Correct 181 ms 38792 KB Output is correct
9 Correct 515 ms 62696 KB Output is correct
10 Correct 522 ms 62704 KB Output is correct
11 Correct 518 ms 62796 KB Output is correct
12 Correct 515 ms 62712 KB Output is correct
13 Correct 374 ms 60108 KB Output is correct
14 Correct 232 ms 39544 KB Output is correct
15 Correct 524 ms 62700 KB Output is correct
16 Correct 314 ms 81404 KB Output is correct
17 Correct 323 ms 81348 KB Output is correct
18 Correct 426 ms 69496 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 1944 KB Output is correct
2 Correct 206 ms 31256 KB Output is correct
3 Correct 206 ms 31060 KB Output is correct
4 Correct 275 ms 46040 KB Output is correct
5 Correct 229 ms 39300 KB Output is correct
6 Correct 198 ms 31348 KB Output is correct
7 Correct 193 ms 46384 KB Output is correct
8 Correct 181 ms 38792 KB Output is correct
9 Correct 369 ms 46992 KB Output is correct
10 Correct 369 ms 52196 KB Output is correct
11 Correct 341 ms 46720 KB Output is correct
12 Correct 419 ms 54360 KB Output is correct
13 Correct 298 ms 45508 KB Output is correct
14 Correct 396 ms 57528 KB Output is correct
15 Correct 396 ms 50028 KB Output is correct
16 Correct 364 ms 48952 KB Output is correct
17 Correct 306 ms 58628 KB Output is correct
18 Correct 350 ms 45236 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 1944 KB Output is correct
2 Correct 206 ms 31256 KB Output is correct
3 Correct 206 ms 31060 KB Output is correct
4 Correct 275 ms 46040 KB Output is correct
5 Correct 229 ms 39300 KB Output is correct
6 Correct 198 ms 31348 KB Output is correct
7 Correct 193 ms 46384 KB Output is correct
8 Correct 181 ms 38792 KB Output is correct
9 Correct 515 ms 62696 KB Output is correct
10 Correct 522 ms 62704 KB Output is correct
11 Correct 518 ms 62796 KB Output is correct
12 Correct 515 ms 62712 KB Output is correct
13 Correct 374 ms 60108 KB Output is correct
14 Correct 232 ms 39544 KB Output is correct
15 Correct 524 ms 62700 KB Output is correct
16 Correct 314 ms 81404 KB Output is correct
17 Correct 323 ms 81348 KB Output is correct
18 Correct 426 ms 69496 KB Output is correct
19 Correct 369 ms 46992 KB Output is correct
20 Correct 369 ms 52196 KB Output is correct
21 Correct 341 ms 46720 KB Output is correct
22 Correct 419 ms 54360 KB Output is correct
23 Correct 298 ms 45508 KB Output is correct
24 Correct 396 ms 57528 KB Output is correct
25 Correct 396 ms 50028 KB Output is correct
26 Correct 364 ms 48952 KB Output is correct
27 Correct 306 ms 58628 KB Output is correct
28 Correct 350 ms 45236 KB Output is correct
29 Correct 647 ms 90260 KB Output is correct
30 Correct 442 ms 66132 KB Output is correct
31 Correct 606 ms 83460 KB Output is correct
32 Correct 288 ms 41988 KB Output is correct
33 Correct 652 ms 83816 KB Output is correct
34 Correct 282 ms 33864 KB Output is correct
35 Correct 635 ms 76680 KB Output is correct
36 Correct 685 ms 88216 KB Output is correct
37 Correct 442 ms 101380 KB Output is correct
38 Correct 503 ms 81240 KB Output is correct
39 Correct 361 ms 45868 KB Output is correct