답안 #1087692

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1087692 2024-09-13T05:57:43 Z vladilius Reconstruction Project (JOI22_reconstruction) C++17
70 / 100
5000 ms 426740 KB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
#define ins insert
#define arr3 array<int, 3>
const int inf = 1e9 + 5;
const int N = 5e2;

struct dsu1{
    int sz[N + 1], p[N + 1], n;
    vector<int> ed;
    ll W;
    dsu1(int ns){
        n = ns;
    }
    int get(int v){
        if (p[v] != v){
            p[v] = get(p[v]);
        }
        return p[v];
    }
    void unite(int x, int y, int w){
        x = get(x); y = get(y);
        if (x == y) return;
        if (sz[x] > sz[y]) swap(x, y);
        p[x] = y;
        sz[y] += sz[x];
        W += w;
        ed.pb(w);
    }
    void clear(){
        for (int i = 1; i <= n; i++){
            p[i] = i;
            sz[i] = 1;
        }
        ed.clear();
        W = 0;
    }
};

struct dsu{
    int sz[N + 1], p[N + 1], n;
    ll W;
    dsu(int ns){
        n = ns;
    }
    int get(int v){
        if (p[v] != v){
            p[v] = get(p[v]);
        }
        return p[v];
    }
    void unite(int x, int y, int w){
        x = get(x); y = get(y);
        if (x == y) return;
        if (sz[x] > sz[y]) swap(x, y);
        p[x] = y;
        sz[y] += sz[x];
        W += w;
    }
    void clear(){
        for (int i = 1; i <= n; i++){
            p[i] = i;
            sz[i] = 1;
        }
        W = 0;
    }
};
 
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n, m; cin>>n>>m;
    vector<arr3> ed = {{0, 0, 0}};
    for (int i = 1; i <= m; i++){
        int a, b, w; cin>>a>>b>>w;
        ed.pb({a, b, w});
    }
    ed.pb({0, 0, inf});
 
    auto cmp = [&](arr3& x, arr3& y){
        return x[2] < y[2];
    };
    sort(ed.begin(), ed.end(), cmp);
    
    vector<int> actl[m + 2];
    dsu1 T1(n);
    for (int i = 1; i <= m; i++){
        T1.clear();
        T1.unite(ed[i][0], ed[i][1], i);
        for (int j: actl[i - 1]){
            T1.unite(ed[j][0], ed[j][1], j);
        }
        actl[i] = T1.ed;
    }
    
    vector<int> actr[m + 2];
    for (int i = m; i > 0; i--){
        T1.clear();
        T1.unite(ed[i][0], ed[i][1], i);
        for (int j: actr[i + 1]){
            T1.unite(ed[j][0], ed[j][1], j);
        }
        actr[i] = T1.ed;
    }
    
    int q; cin>>q;
    vector<pii> qs;
    for (int i = 1; i <= q; i++){
        int x; cin>>x;
        qs.pb({x, i});
    }
    sort(qs.begin(), qs.end());
 
    vector<ll> out(q + 1);
    int j1 = 0;
    dsu T(n);
    for (int i = 0; i <= m; i++){
        vector<int>& edg1 = actl[i], edg2 = actr[i + 1];
        
        int l = ed[i][2], r = ed[i + 1][2] - 1;
        int j2 = j1;
        while (j2 < qs.size() && l <= qs[j2].ff && qs[j2].ff <= r){
            j2++;
        }
        while (j1 < j2){
            int x = qs[j1].ff;
            int i1 = 0, i2 = 0;
            T.clear();
            while (i1 < edg1.size() || i2 < edg2.size()){
                if (i1 == edg1.size()){
                    int j = edg2[i2];
                    T.unite(ed[j][0], ed[j][1], abs(ed[j][2] - x));
                    i2++;
                    continue;
                }
                if (i2 == edg2.size()){
                    int j = edg1[i1];
                    T.unite(ed[j][0], ed[j][1], abs(ed[j][2] - x));
                    i1++;
                    continue;
                }
                int v1 = abs(ed[edg1[i1]][2] - x);
                int v2 = abs(ed[edg2[i2]][2] - x);
                if (v1 < v2){
                    int j = edg1[i1];
                    T.unite(ed[j][0], ed[j][1], v1);
                    i1++;
                }
                else {
                    int j = edg2[i2];
                    T.unite(ed[j][0], ed[j][1], v2);
                    i2++;
                }
            }
            out[qs[j1].ss] = T.W;
            j1++;
        }
    }
    
    for (int i = 1; i <= q; i++) cout<<out[i]<<"\n";
}

Compilation message

reconstruction.cpp: In function 'int main()':
reconstruction.cpp:131:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  131 |         while (j2 < qs.size() && l <= qs[j2].ff && qs[j2].ff <= r){
      |                ~~~^~~~~~~~~~~
reconstruction.cpp:138:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |             while (i1 < edg1.size() || i2 < edg2.size()){
      |                    ~~~^~~~~~~~~~~~~
reconstruction.cpp:138:43: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |             while (i1 < edg1.size() || i2 < edg2.size()){
      |                                        ~~~^~~~~~~~~~~~~
reconstruction.cpp:139:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  139 |                 if (i1 == edg1.size()){
      |                     ~~~^~~~~~~~~~~~~~
reconstruction.cpp:145:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 |                 if (i2 == edg2.size()){
      |                     ~~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 460 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 1 ms 600 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 460 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 1 ms 600 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 717 ms 401300 KB Output is correct
21 Correct 639 ms 379552 KB Output is correct
22 Correct 653 ms 396224 KB Output is correct
23 Correct 676 ms 400088 KB Output is correct
24 Correct 698 ms 400844 KB Output is correct
25 Correct 740 ms 401404 KB Output is correct
26 Correct 723 ms 401348 KB Output is correct
27 Correct 728 ms 401304 KB Output is correct
28 Correct 734 ms 401152 KB Output is correct
29 Correct 741 ms 401168 KB Output is correct
30 Correct 754 ms 401280 KB Output is correct
31 Correct 776 ms 401352 KB Output is correct
32 Correct 761 ms 401348 KB Output is correct
33 Correct 756 ms 401344 KB Output is correct
34 Correct 751 ms 401388 KB Output is correct
35 Correct 740 ms 401344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Execution timed out 5056 ms 426740 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 460 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 1 ms 600 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 464 KB Output is correct
20 Correct 3837 ms 40848 KB Output is correct
21 Correct 4058 ms 40992 KB Output is correct
22 Correct 3844 ms 40856 KB Output is correct
23 Correct 3770 ms 40848 KB Output is correct
24 Correct 3840 ms 40124 KB Output is correct
25 Correct 3751 ms 40144 KB Output is correct
26 Correct 4804 ms 40252 KB Output is correct
27 Correct 3476 ms 40364 KB Output is correct
28 Correct 3858 ms 40268 KB Output is correct
29 Correct 3900 ms 40360 KB Output is correct
30 Correct 3819 ms 40360 KB Output is correct
31 Correct 3782 ms 40128 KB Output is correct
32 Correct 3756 ms 40896 KB Output is correct
33 Correct 4464 ms 40104 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 460 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 1 ms 600 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 717 ms 401300 KB Output is correct
21 Correct 639 ms 379552 KB Output is correct
22 Correct 653 ms 396224 KB Output is correct
23 Correct 676 ms 400088 KB Output is correct
24 Correct 698 ms 400844 KB Output is correct
25 Correct 740 ms 401404 KB Output is correct
26 Correct 723 ms 401348 KB Output is correct
27 Correct 728 ms 401304 KB Output is correct
28 Correct 734 ms 401152 KB Output is correct
29 Correct 741 ms 401168 KB Output is correct
30 Correct 754 ms 401280 KB Output is correct
31 Correct 776 ms 401352 KB Output is correct
32 Correct 761 ms 401348 KB Output is correct
33 Correct 756 ms 401344 KB Output is correct
34 Correct 751 ms 401388 KB Output is correct
35 Correct 740 ms 401344 KB Output is correct
36 Correct 1094 ms 402088 KB Output is correct
37 Correct 975 ms 380504 KB Output is correct
38 Correct 1073 ms 396972 KB Output is correct
39 Correct 1090 ms 401088 KB Output is correct
40 Correct 1097 ms 401700 KB Output is correct
41 Correct 1071 ms 402012 KB Output is correct
42 Correct 1075 ms 402104 KB Output is correct
43 Correct 1102 ms 402120 KB Output is correct
44 Correct 895 ms 401972 KB Output is correct
45 Correct 829 ms 402236 KB Output is correct
46 Correct 1141 ms 401968 KB Output is correct
47 Correct 1122 ms 402024 KB Output is correct
48 Correct 1129 ms 402116 KB Output is correct
49 Correct 1090 ms 402032 KB Output is correct
50 Correct 809 ms 402064 KB Output is correct
51 Correct 824 ms 402012 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 460 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 1 ms 600 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 717 ms 401300 KB Output is correct
21 Correct 639 ms 379552 KB Output is correct
22 Correct 653 ms 396224 KB Output is correct
23 Correct 676 ms 400088 KB Output is correct
24 Correct 698 ms 400844 KB Output is correct
25 Correct 740 ms 401404 KB Output is correct
26 Correct 723 ms 401348 KB Output is correct
27 Correct 728 ms 401304 KB Output is correct
28 Correct 734 ms 401152 KB Output is correct
29 Correct 741 ms 401168 KB Output is correct
30 Correct 754 ms 401280 KB Output is correct
31 Correct 776 ms 401352 KB Output is correct
32 Correct 761 ms 401348 KB Output is correct
33 Correct 756 ms 401344 KB Output is correct
34 Correct 751 ms 401388 KB Output is correct
35 Correct 740 ms 401344 KB Output is correct
36 Correct 0 ms 344 KB Output is correct
37 Correct 0 ms 348 KB Output is correct
38 Correct 0 ms 348 KB Output is correct
39 Execution timed out 5056 ms 426740 KB Time limit exceeded
40 Halted 0 ms 0 KB -