Submission #261341

# Submission time Handle Problem Language Result Execution time Memory
261341 2020-08-11T16:21:46 Z rqi Bridges (APIO19_bridges) C++14
100 / 100
2790 ms 13596 KB
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pi;
typedef vector<int> vi;
typedef vector<pi> vpi;

#define mp make_pair
#define ins insert
#define f first
#define s second
#define pb push_back


const int mx = 100005;
const int SQ = (sqrt(mx)*9)/3;
int n, m;
int u[mx];
int v[mx];
int d[mx];

int t[mx];
int b[mx];
int r[mx];
int s[mx];
int w[mx];
int ans[mx];
int mind[mx];

void ps(int x){
    cout << x << "\n";
}

struct DSU {
    vi e;
    void init(int n){
        e = vi(n+1, -1);
    }
    int get(int a){
        if(e[a] < 0) return a;
        e[a] = get(e[a]);
        return e[a];
    }
    int getSize(int a){
        a = get(a);
        return -e[a];
    }
    bool unite(int a, int b){
        a = get(a);
        b = get(b);
        if(a == b) return 0;
        if(-e[a] < -e[b]) swap(a, b);
        e[a]+=e[b];
        e[b] = a;
        return 1;
    }

};

set<pi> eds; //weight, index
bool notinc[mx];
int cursp[mx]; //weight of special edges

void INSERT(int ind){
    eds.ins(mp(d[ind], ind));
}

void ERASE(int ind){
    eds.erase(eds.find(mp(d[ind], ind)));
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= m; i++){
        cin >> u[i] >> v[i] >> d[i];
    }
    int q;
    cin >> q;
    for(int i = 1; i <= q; i++){
        cin >> t[i];
        if(t[i] == 1){
            cin >> b[i] >> r[i];
        }
        else{
            cin >> s[i] >> w[i];
        }
    }

    
    for(int i = 1; i <= m; i++){
        INSERT(i);
    }

    for(int i = 1; i <= q; i+=SQ){
        vpi speceds; //index, original weight
        for(int j = i; j < i+SQ; j++){
            if(t[j] == 1){
                notinc[b[j]] = 1;
            }
        }
        for(int j = 1; j <= m; j++){ //m*q/SQ
            if(notinc[j]){
                speceds.pb(mp(j, d[j]));
            }
        }

        set<pair<pi, int>> queries;

        for(int j = i; j < i+SQ; j++){ //qlog q
            if(t[j] == 2){
                queries.ins(mp(mp(-w[j], s[j]), j));
            }
        }

        DSU bdsu;
        bdsu.init(n);

        auto it = eds.end();

        for(auto x: queries){
            int weight = -x.f.f;
            int node = x.f.s;
            int ind = x.s;
            while(it != eds.begin()){ //m*q/SQ
                pi val = *(prev(it));
                if(val.f < weight){
                    break;
                }
                it = prev(it);
                if(notinc[val.s]) continue;
                bdsu.unite(u[val.s], v[val.s]);
            }
            for(auto x: speceds){ //q*SQ
                cursp[x.f] = x.s;
            }
            for(int j = i; j < ind; j++){ //q*SQ
                if(t[j] == 1){
                    if(notinc[b[j]]){
                        cursp[b[j]] = r[j];
                    }
                }
            }


            node = bdsu.get(node);
            bool flag = 0;
            vpi seds;
            for(auto x: speceds){ //q*SQ
                if(cursp[x.f] >= weight){ 
                    seds.pb(mp(bdsu.get(u[x.f]), bdsu.get(v[x.f])));
                }
            }
            for(auto x: seds){ //q*SQ
                if(x.f == node || x.s == node){
                    flag = 1;
                    break;
                }
            }
            if(flag == 0){
                ans[ind] = bdsu.getSize(node);
                continue;
            }
            DSU sdsu;
            sdsu.init(2*SQ);
            //map each relevant node
            for(auto x: seds){
                mind[x.f] = 0;
                mind[x.s] = 0;
            }
            int cnt = 0;
            for(auto x: seds){ //q*SQ*ack
                if(mind[x.f] == 0){
                    mind[x.f] = ++cnt;
                    sdsu.e[cnt] = -bdsu.getSize(x.f);
                }
                if(mind[x.s] == 0){
                    mind[x.s] = ++cnt; 
                    sdsu.e[cnt] = -bdsu.getSize(x.s);
                }
            }
            for(auto x: seds){ //q*SQ*ack
                sdsu.unite(mind[x.f], mind[x.s]);
            }
            ans[ind] = sdsu.getSize(mind[node]);
        }


        for(int j = i; j < i+SQ; j++){
            if(t[j] == 1){
                notinc[b[j]] = 0;
            }
        }
        //update eds
        for(int j = i; j < i+SQ; j++){
            if(t[j] == 1){
                ERASE(b[j]);
                d[b[j]] = r[j];
                INSERT(b[j]);
            }
        }
    }

    for(int i = 1; i <= q; i++){
        if(t[i] == 2){
            ps(ans[i]);
        }
    }

}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 52 ms 768 KB Output is correct
4 Correct 9 ms 640 KB Output is correct
5 Correct 31 ms 736 KB Output is correct
6 Correct 27 ms 720 KB Output is correct
7 Correct 29 ms 640 KB Output is correct
8 Correct 32 ms 768 KB Output is correct
9 Correct 34 ms 640 KB Output is correct
10 Correct 34 ms 640 KB Output is correct
11 Correct 29 ms 628 KB Output is correct
12 Correct 34 ms 640 KB Output is correct
13 Correct 40 ms 640 KB Output is correct
14 Correct 35 ms 768 KB Output is correct
15 Correct 28 ms 760 KB Output is correct
16 Correct 30 ms 704 KB Output is correct
17 Correct 31 ms 640 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1525 ms 6432 KB Output is correct
2 Correct 1413 ms 6568 KB Output is correct
3 Correct 1303 ms 6416 KB Output is correct
4 Correct 1233 ms 6568 KB Output is correct
5 Correct 1313 ms 6496 KB Output is correct
6 Correct 2233 ms 6656 KB Output is correct
7 Correct 2079 ms 6620 KB Output is correct
8 Correct 1992 ms 6728 KB Output is correct
9 Correct 86 ms 2272 KB Output is correct
10 Correct 1253 ms 6524 KB Output is correct
11 Correct 1117 ms 6440 KB Output is correct
12 Correct 1281 ms 6948 KB Output is correct
13 Correct 1065 ms 6568 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 965 ms 5432 KB Output is correct
2 Correct 938 ms 3708 KB Output is correct
3 Correct 1378 ms 5496 KB Output is correct
4 Correct 966 ms 5256 KB Output is correct
5 Correct 84 ms 2296 KB Output is correct
6 Correct 1097 ms 5532 KB Output is correct
7 Correct 902 ms 5644 KB Output is correct
8 Correct 789 ms 5244 KB Output is correct
9 Correct 696 ms 5680 KB Output is correct
10 Correct 615 ms 5348 KB Output is correct
11 Correct 639 ms 5308 KB Output is correct
12 Correct 570 ms 5128 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1898 ms 8516 KB Output is correct
2 Correct 89 ms 2168 KB Output is correct
3 Correct 179 ms 6520 KB Output is correct
4 Correct 96 ms 6520 KB Output is correct
5 Correct 793 ms 8580 KB Output is correct
6 Correct 1443 ms 8596 KB Output is correct
7 Correct 931 ms 8744 KB Output is correct
8 Correct 522 ms 5288 KB Output is correct
9 Correct 597 ms 5288 KB Output is correct
10 Correct 543 ms 5560 KB Output is correct
11 Correct 1255 ms 6952 KB Output is correct
12 Correct 1287 ms 6816 KB Output is correct
13 Correct 896 ms 7152 KB Output is correct
14 Correct 605 ms 8616 KB Output is correct
15 Correct 822 ms 8776 KB Output is correct
16 Correct 1759 ms 8392 KB Output is correct
17 Correct 1501 ms 8628 KB Output is correct
18 Correct 1505 ms 8556 KB Output is correct
19 Correct 1978 ms 8616 KB Output is correct
20 Correct 1367 ms 7868 KB Output is correct
21 Correct 1299 ms 7764 KB Output is correct
22 Correct 1635 ms 8452 KB Output is correct
23 Correct 1018 ms 7688 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1525 ms 6432 KB Output is correct
2 Correct 1413 ms 6568 KB Output is correct
3 Correct 1303 ms 6416 KB Output is correct
4 Correct 1233 ms 6568 KB Output is correct
5 Correct 1313 ms 6496 KB Output is correct
6 Correct 2233 ms 6656 KB Output is correct
7 Correct 2079 ms 6620 KB Output is correct
8 Correct 1992 ms 6728 KB Output is correct
9 Correct 86 ms 2272 KB Output is correct
10 Correct 1253 ms 6524 KB Output is correct
11 Correct 1117 ms 6440 KB Output is correct
12 Correct 1281 ms 6948 KB Output is correct
13 Correct 1065 ms 6568 KB Output is correct
14 Correct 965 ms 5432 KB Output is correct
15 Correct 938 ms 3708 KB Output is correct
16 Correct 1378 ms 5496 KB Output is correct
17 Correct 966 ms 5256 KB Output is correct
18 Correct 84 ms 2296 KB Output is correct
19 Correct 1097 ms 5532 KB Output is correct
20 Correct 902 ms 5644 KB Output is correct
21 Correct 789 ms 5244 KB Output is correct
22 Correct 696 ms 5680 KB Output is correct
23 Correct 615 ms 5348 KB Output is correct
24 Correct 639 ms 5308 KB Output is correct
25 Correct 570 ms 5128 KB Output is correct
26 Correct 1377 ms 6740 KB Output is correct
27 Correct 1733 ms 7076 KB Output is correct
28 Correct 1272 ms 6712 KB Output is correct
29 Correct 934 ms 6756 KB Output is correct
30 Correct 1378 ms 6908 KB Output is correct
31 Correct 1410 ms 6840 KB Output is correct
32 Correct 1685 ms 6828 KB Output is correct
33 Correct 1255 ms 6744 KB Output is correct
34 Correct 1159 ms 6824 KB Output is correct
35 Correct 1286 ms 6624 KB Output is correct
36 Correct 973 ms 6572 KB Output is correct
37 Correct 994 ms 6648 KB Output is correct
38 Correct 906 ms 6568 KB Output is correct
39 Correct 708 ms 6824 KB Output is correct
40 Correct 853 ms 6804 KB Output is correct
41 Correct 792 ms 6964 KB Output is correct
42 Correct 745 ms 6696 KB Output is correct
43 Correct 699 ms 6568 KB Output is correct
44 Correct 670 ms 6564 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 52 ms 768 KB Output is correct
4 Correct 9 ms 640 KB Output is correct
5 Correct 31 ms 736 KB Output is correct
6 Correct 27 ms 720 KB Output is correct
7 Correct 29 ms 640 KB Output is correct
8 Correct 32 ms 768 KB Output is correct
9 Correct 34 ms 640 KB Output is correct
10 Correct 34 ms 640 KB Output is correct
11 Correct 29 ms 628 KB Output is correct
12 Correct 34 ms 640 KB Output is correct
13 Correct 40 ms 640 KB Output is correct
14 Correct 35 ms 768 KB Output is correct
15 Correct 28 ms 760 KB Output is correct
16 Correct 30 ms 704 KB Output is correct
17 Correct 31 ms 640 KB Output is correct
18 Correct 1525 ms 6432 KB Output is correct
19 Correct 1413 ms 6568 KB Output is correct
20 Correct 1303 ms 6416 KB Output is correct
21 Correct 1233 ms 6568 KB Output is correct
22 Correct 1313 ms 6496 KB Output is correct
23 Correct 2233 ms 6656 KB Output is correct
24 Correct 2079 ms 6620 KB Output is correct
25 Correct 1992 ms 6728 KB Output is correct
26 Correct 86 ms 2272 KB Output is correct
27 Correct 1253 ms 6524 KB Output is correct
28 Correct 1117 ms 6440 KB Output is correct
29 Correct 1281 ms 6948 KB Output is correct
30 Correct 1065 ms 6568 KB Output is correct
31 Correct 965 ms 5432 KB Output is correct
32 Correct 938 ms 3708 KB Output is correct
33 Correct 1378 ms 5496 KB Output is correct
34 Correct 966 ms 5256 KB Output is correct
35 Correct 84 ms 2296 KB Output is correct
36 Correct 1097 ms 5532 KB Output is correct
37 Correct 902 ms 5644 KB Output is correct
38 Correct 789 ms 5244 KB Output is correct
39 Correct 696 ms 5680 KB Output is correct
40 Correct 615 ms 5348 KB Output is correct
41 Correct 639 ms 5308 KB Output is correct
42 Correct 570 ms 5128 KB Output is correct
43 Correct 1898 ms 8516 KB Output is correct
44 Correct 89 ms 2168 KB Output is correct
45 Correct 179 ms 6520 KB Output is correct
46 Correct 96 ms 6520 KB Output is correct
47 Correct 793 ms 8580 KB Output is correct
48 Correct 1443 ms 8596 KB Output is correct
49 Correct 931 ms 8744 KB Output is correct
50 Correct 522 ms 5288 KB Output is correct
51 Correct 597 ms 5288 KB Output is correct
52 Correct 543 ms 5560 KB Output is correct
53 Correct 1255 ms 6952 KB Output is correct
54 Correct 1287 ms 6816 KB Output is correct
55 Correct 896 ms 7152 KB Output is correct
56 Correct 605 ms 8616 KB Output is correct
57 Correct 822 ms 8776 KB Output is correct
58 Correct 1759 ms 8392 KB Output is correct
59 Correct 1501 ms 8628 KB Output is correct
60 Correct 1505 ms 8556 KB Output is correct
61 Correct 1978 ms 8616 KB Output is correct
62 Correct 1367 ms 7868 KB Output is correct
63 Correct 1299 ms 7764 KB Output is correct
64 Correct 1635 ms 8452 KB Output is correct
65 Correct 1018 ms 7688 KB Output is correct
66 Correct 1377 ms 6740 KB Output is correct
67 Correct 1733 ms 7076 KB Output is correct
68 Correct 1272 ms 6712 KB Output is correct
69 Correct 934 ms 6756 KB Output is correct
70 Correct 1378 ms 6908 KB Output is correct
71 Correct 1410 ms 6840 KB Output is correct
72 Correct 1685 ms 6828 KB Output is correct
73 Correct 1255 ms 6744 KB Output is correct
74 Correct 1159 ms 6824 KB Output is correct
75 Correct 1286 ms 6624 KB Output is correct
76 Correct 973 ms 6572 KB Output is correct
77 Correct 994 ms 6648 KB Output is correct
78 Correct 906 ms 6568 KB Output is correct
79 Correct 708 ms 6824 KB Output is correct
80 Correct 853 ms 6804 KB Output is correct
81 Correct 792 ms 6964 KB Output is correct
82 Correct 745 ms 6696 KB Output is correct
83 Correct 699 ms 6568 KB Output is correct
84 Correct 670 ms 6564 KB Output is correct
85 Correct 2367 ms 10084 KB Output is correct
86 Correct 275 ms 7288 KB Output is correct
87 Correct 180 ms 7288 KB Output is correct
88 Correct 1796 ms 10176 KB Output is correct
89 Correct 2767 ms 9916 KB Output is correct
90 Correct 1846 ms 12100 KB Output is correct
91 Correct 1187 ms 9404 KB Output is correct
92 Correct 1181 ms 9496 KB Output is correct
93 Correct 1758 ms 9272 KB Output is correct
94 Correct 1693 ms 11440 KB Output is correct
95 Correct 1970 ms 11468 KB Output is correct
96 Correct 2388 ms 11320 KB Output is correct
97 Correct 1295 ms 12072 KB Output is correct
98 Correct 1187 ms 11812 KB Output is correct
99 Correct 2393 ms 13444 KB Output is correct
100 Correct 2790 ms 13456 KB Output is correct
101 Correct 2471 ms 13596 KB Output is correct
102 Correct 2467 ms 13516 KB Output is correct
103 Correct 2169 ms 12104 KB Output is correct
104 Correct 2072 ms 11944 KB Output is correct
105 Correct 1567 ms 11664 KB Output is correct
106 Correct 1658 ms 11112 KB Output is correct
107 Correct 1803 ms 12072 KB Output is correct
108 Correct 2378 ms 13052 KB Output is correct
109 Correct 1799 ms 10432 KB Output is correct