답안 #773491

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
773491 2023-07-05T06:01:58 Z Magikarp4000 다리 (APIO19_bridges) C++17
100 / 100
2288 ms 15916 KB
#include <bits/stdc++.h>
using namespace std;
#define OPTM ios_base::sync_with_stdio(0); cin.tie(0);
#define INF int(1e9+7)
#define ln '\n' 
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define us unsigned short
#define FOR(i,s,n) for (int i = s; i < n; i++)
#define FORR(i,n,s) for (int i = n; i > s; i--)
#define FORX(u, arr) for (auto u : arr)
#define PB push_back
#define in(v,x) (v.find(x) != v.end())
#define F first
#define S second
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define UM unordered_map
#define US unordered_set
#define PQ priority_queue
#define ALL(v) v.begin(), v.end()
const ll LLINF = 1e18+1;

struct Query {
    int idx,x,y;
};

const int MAXN = 1e5+1, BLOCK = 316;
int n,m,q;
int p[MAXN], sz[MAXN], res[MAXN];
vector<pair<PII,PII>> e;
vector<Query> qu1, qu2;
int ans, mp[MAXN];
set<PII> h;
vector<PII> edges;
int wt[MAXN];
vector<int> v[MAXN];
int val[MAXN];
bool z[MAXN], z1[MAXN], z2[MAXN], z3[MAXN];
bool prnt[MAXN];

int finds(int a) {
  if (p[a] != a) p[a] = finds(p[a]);
  return p[a];
}

void unite(int a, int b) {
  a = finds(a);
  b = finds(b);
  if (a != b) {
    if (sz[a] < sz[b]) swap(a,b);
    p[b] = a;
    sz[a] += sz[b];
  }
}

void dfs(int s) {
    if (z[s]) return;
    z[s] = 1;
    ans += sz[s];
    FORX(u,v[s]) {
        dfs(u);
    }
}

bool cmp(const Query& a, const Query& b) {
    return a.y > b.y;
}

signed main() {
    OPTM;
    cin >> n >> m;
    FOR(i,0,m) {
        int a,b,w; cin >> a >> b >> w;
        e.PB({{w,i},{a,b}});
        h.insert({-w,i});
        edges.PB({a,b});
        wt[i] = w;
    }
    cin >> q;
    int i = 0;
    while (i < q) {
        int bruh = 0;
        FORX(u,h) {
            e[bruh] = {{-u.F,u.S},edges[u.S]};
            bruh++;
        }
        FOR(l,0,m) mp[e[l].F.S] = l;
        qu1.clear(); qu2.clear();
        FOR(l,1,n+1) {
            p[l] = l;
            sz[l] = 1;
        }
        int j = 0;
        vector<int> vis;
        while (j < BLOCK && i < q) {
            int t,s,w; cin >> t >> s >> w;
            if (t == 1) {
                qu1.PB({i,s-1,w});
                if (!z3[s-1]) {
                    z3[s-1] = 1;
                    vis.PB(s-1);
                }
            }
            else {
                qu2.PB({i,s,w});
                prnt[i] = 1;
            }
            j++; i++;
        }
        sort(ALL(qu2),cmp);
        vector<pair<int,PII>> e1;
        FOR(j,0,m) if (!z3[e[j].F.S]) e1.PB({e[j].F.F,e[j].S});
        int en = e1.size();
        int q1n = qu1.size(), q2n = qu2.size();
        int k = 0;
        FOR(j,0,q2n) {
            while (k < en && e1[k].F >= qu2[j].y) {
                unite(e1[k].S.F, e1[k].S.S);
                k++;
            }
            ans = 0;
            FOR(l,0,q1n) {
                int pos = mp[qu1[l].x], w = qu1[l].y;
                if (qu1[l].idx < qu2[j].idx) val[pos] = w;
                else if (!val[pos]) val[pos] = e[pos].F.F;
            }
            vector<int> toclear;
            FOR(l,0,q1n) {
                int pos = mp[qu1[l].x];
                if (!z1[pos] && val[pos] >= qu2[j].y) {
                    int a = finds(e[pos].S.F), b = finds(e[pos].S.S);
                    z1[pos] = 1;
                    v[a].PB(b);
                    v[b].PB(a);
                    if (!z2[a]) {
                        z2[a] = 1;
                        toclear.PB(a);
                    }
                    if (!z2[b]) {
                        z2[b] = 1;
                        toclear.PB(b);
                    }
                }
            }
            int start = finds(qu2[j].x);
            dfs(start);
            if (!z2[start]) {
                z2[start] = 1;
                toclear.PB(start);
            }
            res[qu2[j].idx] = ans;
            FORX(u,toclear) {
                z[u] = z2[u] = 0;
                v[u].clear();
            }
            FORX(u,vis) z3[u] = 0;
            FOR(l,0,q1n) val[mp[qu1[l].x]] = z1[mp[qu1[l].x]] = 0;
        }
        FOR(l,0,q1n) {
            int pos = qu1[l].x;
            h.erase({-wt[pos],pos});
            wt[pos] = qu1[l].y;
            h.insert({-wt[pos],pos});
        }
    }
    FOR(i,0,q) if (prnt[i]) cout << res[i] << ln;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Correct 1 ms 2644 KB Output is correct
3 Correct 16 ms 2908 KB Output is correct
4 Correct 5 ms 2772 KB Output is correct
5 Correct 13 ms 2768 KB Output is correct
6 Correct 14 ms 2784 KB Output is correct
7 Correct 13 ms 2772 KB Output is correct
8 Correct 17 ms 2752 KB Output is correct
9 Correct 15 ms 2772 KB Output is correct
10 Correct 14 ms 2784 KB Output is correct
11 Correct 14 ms 2776 KB Output is correct
12 Correct 15 ms 2756 KB Output is correct
13 Correct 16 ms 2752 KB Output is correct
14 Correct 15 ms 2788 KB Output is correct
15 Correct 16 ms 2772 KB Output is correct
16 Correct 14 ms 2780 KB Output is correct
17 Correct 14 ms 2768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1162 ms 10788 KB Output is correct
2 Correct 1111 ms 10720 KB Output is correct
3 Correct 1158 ms 10676 KB Output is correct
4 Correct 1166 ms 10596 KB Output is correct
5 Correct 1117 ms 10600 KB Output is correct
6 Correct 1308 ms 9560 KB Output is correct
7 Correct 1179 ms 9664 KB Output is correct
8 Correct 1197 ms 9504 KB Output is correct
9 Correct 29 ms 3380 KB Output is correct
10 Correct 904 ms 10652 KB Output is correct
11 Correct 923 ms 10524 KB Output is correct
12 Correct 1008 ms 9276 KB Output is correct
13 Correct 1008 ms 9724 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 755 ms 8008 KB Output is correct
2 Correct 358 ms 4572 KB Output is correct
3 Correct 830 ms 7932 KB Output is correct
4 Correct 788 ms 7956 KB Output is correct
5 Correct 29 ms 3284 KB Output is correct
6 Correct 789 ms 7892 KB Output is correct
7 Correct 759 ms 7940 KB Output is correct
8 Correct 736 ms 8016 KB Output is correct
9 Correct 616 ms 7320 KB Output is correct
10 Correct 587 ms 7384 KB Output is correct
11 Correct 636 ms 8096 KB Output is correct
12 Correct 628 ms 7996 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2000 ms 14236 KB Output is correct
2 Correct 39 ms 3276 KB Output is correct
3 Correct 227 ms 13284 KB Output is correct
4 Correct 127 ms 13308 KB Output is correct
5 Correct 1633 ms 14212 KB Output is correct
6 Correct 1877 ms 14292 KB Output is correct
7 Correct 1505 ms 14252 KB Output is correct
8 Correct 901 ms 9032 KB Output is correct
9 Correct 897 ms 8992 KB Output is correct
10 Correct 895 ms 9088 KB Output is correct
11 Correct 1500 ms 12088 KB Output is correct
12 Correct 1537 ms 12140 KB Output is correct
13 Correct 1521 ms 12008 KB Output is correct
14 Correct 1326 ms 14424 KB Output is correct
15 Correct 1421 ms 14240 KB Output is correct
16 Correct 2037 ms 14200 KB Output is correct
17 Correct 2001 ms 14376 KB Output is correct
18 Correct 2111 ms 14300 KB Output is correct
19 Correct 2053 ms 14324 KB Output is correct
20 Correct 1752 ms 12788 KB Output is correct
21 Correct 1670 ms 12732 KB Output is correct
22 Correct 1906 ms 13856 KB Output is correct
23 Correct 1437 ms 12440 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1162 ms 10788 KB Output is correct
2 Correct 1111 ms 10720 KB Output is correct
3 Correct 1158 ms 10676 KB Output is correct
4 Correct 1166 ms 10596 KB Output is correct
5 Correct 1117 ms 10600 KB Output is correct
6 Correct 1308 ms 9560 KB Output is correct
7 Correct 1179 ms 9664 KB Output is correct
8 Correct 1197 ms 9504 KB Output is correct
9 Correct 29 ms 3380 KB Output is correct
10 Correct 904 ms 10652 KB Output is correct
11 Correct 923 ms 10524 KB Output is correct
12 Correct 1008 ms 9276 KB Output is correct
13 Correct 1008 ms 9724 KB Output is correct
14 Correct 755 ms 8008 KB Output is correct
15 Correct 358 ms 4572 KB Output is correct
16 Correct 830 ms 7932 KB Output is correct
17 Correct 788 ms 7956 KB Output is correct
18 Correct 29 ms 3284 KB Output is correct
19 Correct 789 ms 7892 KB Output is correct
20 Correct 759 ms 7940 KB Output is correct
21 Correct 736 ms 8016 KB Output is correct
22 Correct 616 ms 7320 KB Output is correct
23 Correct 587 ms 7384 KB Output is correct
24 Correct 636 ms 8096 KB Output is correct
25 Correct 628 ms 7996 KB Output is correct
26 Correct 1109 ms 10520 KB Output is correct
27 Correct 1199 ms 10492 KB Output is correct
28 Correct 1185 ms 10572 KB Output is correct
29 Correct 1028 ms 10508 KB Output is correct
30 Correct 1215 ms 10652 KB Output is correct
31 Correct 1234 ms 10516 KB Output is correct
32 Correct 1245 ms 10520 KB Output is correct
33 Correct 1242 ms 10504 KB Output is correct
34 Correct 1258 ms 10540 KB Output is correct
35 Correct 1290 ms 10528 KB Output is correct
36 Correct 1155 ms 10488 KB Output is correct
37 Correct 1092 ms 10476 KB Output is correct
38 Correct 1072 ms 10612 KB Output is correct
39 Correct 948 ms 9812 KB Output is correct
40 Correct 985 ms 9896 KB Output is correct
41 Correct 953 ms 9820 KB Output is correct
42 Correct 970 ms 10644 KB Output is correct
43 Correct 949 ms 10752 KB Output is correct
44 Correct 941 ms 10676 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 2644 KB Output is correct
2 Correct 1 ms 2644 KB Output is correct
3 Correct 16 ms 2908 KB Output is correct
4 Correct 5 ms 2772 KB Output is correct
5 Correct 13 ms 2768 KB Output is correct
6 Correct 14 ms 2784 KB Output is correct
7 Correct 13 ms 2772 KB Output is correct
8 Correct 17 ms 2752 KB Output is correct
9 Correct 15 ms 2772 KB Output is correct
10 Correct 14 ms 2784 KB Output is correct
11 Correct 14 ms 2776 KB Output is correct
12 Correct 15 ms 2756 KB Output is correct
13 Correct 16 ms 2752 KB Output is correct
14 Correct 15 ms 2788 KB Output is correct
15 Correct 16 ms 2772 KB Output is correct
16 Correct 14 ms 2780 KB Output is correct
17 Correct 14 ms 2768 KB Output is correct
18 Correct 1162 ms 10788 KB Output is correct
19 Correct 1111 ms 10720 KB Output is correct
20 Correct 1158 ms 10676 KB Output is correct
21 Correct 1166 ms 10596 KB Output is correct
22 Correct 1117 ms 10600 KB Output is correct
23 Correct 1308 ms 9560 KB Output is correct
24 Correct 1179 ms 9664 KB Output is correct
25 Correct 1197 ms 9504 KB Output is correct
26 Correct 29 ms 3380 KB Output is correct
27 Correct 904 ms 10652 KB Output is correct
28 Correct 923 ms 10524 KB Output is correct
29 Correct 1008 ms 9276 KB Output is correct
30 Correct 1008 ms 9724 KB Output is correct
31 Correct 755 ms 8008 KB Output is correct
32 Correct 358 ms 4572 KB Output is correct
33 Correct 830 ms 7932 KB Output is correct
34 Correct 788 ms 7956 KB Output is correct
35 Correct 29 ms 3284 KB Output is correct
36 Correct 789 ms 7892 KB Output is correct
37 Correct 759 ms 7940 KB Output is correct
38 Correct 736 ms 8016 KB Output is correct
39 Correct 616 ms 7320 KB Output is correct
40 Correct 587 ms 7384 KB Output is correct
41 Correct 636 ms 8096 KB Output is correct
42 Correct 628 ms 7996 KB Output is correct
43 Correct 2000 ms 14236 KB Output is correct
44 Correct 39 ms 3276 KB Output is correct
45 Correct 227 ms 13284 KB Output is correct
46 Correct 127 ms 13308 KB Output is correct
47 Correct 1633 ms 14212 KB Output is correct
48 Correct 1877 ms 14292 KB Output is correct
49 Correct 1505 ms 14252 KB Output is correct
50 Correct 901 ms 9032 KB Output is correct
51 Correct 897 ms 8992 KB Output is correct
52 Correct 895 ms 9088 KB Output is correct
53 Correct 1500 ms 12088 KB Output is correct
54 Correct 1537 ms 12140 KB Output is correct
55 Correct 1521 ms 12008 KB Output is correct
56 Correct 1326 ms 14424 KB Output is correct
57 Correct 1421 ms 14240 KB Output is correct
58 Correct 2037 ms 14200 KB Output is correct
59 Correct 2001 ms 14376 KB Output is correct
60 Correct 2111 ms 14300 KB Output is correct
61 Correct 2053 ms 14324 KB Output is correct
62 Correct 1752 ms 12788 KB Output is correct
63 Correct 1670 ms 12732 KB Output is correct
64 Correct 1906 ms 13856 KB Output is correct
65 Correct 1437 ms 12440 KB Output is correct
66 Correct 1109 ms 10520 KB Output is correct
67 Correct 1199 ms 10492 KB Output is correct
68 Correct 1185 ms 10572 KB Output is correct
69 Correct 1028 ms 10508 KB Output is correct
70 Correct 1215 ms 10652 KB Output is correct
71 Correct 1234 ms 10516 KB Output is correct
72 Correct 1245 ms 10520 KB Output is correct
73 Correct 1242 ms 10504 KB Output is correct
74 Correct 1258 ms 10540 KB Output is correct
75 Correct 1290 ms 10528 KB Output is correct
76 Correct 1155 ms 10488 KB Output is correct
77 Correct 1092 ms 10476 KB Output is correct
78 Correct 1072 ms 10612 KB Output is correct
79 Correct 948 ms 9812 KB Output is correct
80 Correct 985 ms 9896 KB Output is correct
81 Correct 953 ms 9820 KB Output is correct
82 Correct 970 ms 10644 KB Output is correct
83 Correct 949 ms 10752 KB Output is correct
84 Correct 941 ms 10676 KB Output is correct
85 Correct 2088 ms 15852 KB Output is correct
86 Correct 216 ms 13892 KB Output is correct
87 Correct 148 ms 13976 KB Output is correct
88 Correct 1822 ms 15616 KB Output is correct
89 Correct 2149 ms 15876 KB Output is correct
90 Correct 1744 ms 15384 KB Output is correct
91 Correct 1178 ms 10540 KB Output is correct
92 Correct 1159 ms 10580 KB Output is correct
93 Correct 1241 ms 9940 KB Output is correct
94 Correct 1828 ms 13804 KB Output is correct
95 Correct 1770 ms 13660 KB Output is correct
96 Correct 1808 ms 12672 KB Output is correct
97 Correct 1586 ms 14824 KB Output is correct
98 Correct 1608 ms 15512 KB Output is correct
99 Correct 2288 ms 15764 KB Output is correct
100 Correct 2284 ms 15756 KB Output is correct
101 Correct 2266 ms 15816 KB Output is correct
102 Correct 2238 ms 15916 KB Output is correct
103 Correct 1914 ms 13488 KB Output is correct
104 Correct 1947 ms 13392 KB Output is correct
105 Correct 1896 ms 13592 KB Output is correct
106 Correct 1597 ms 13016 KB Output is correct
107 Correct 1755 ms 13256 KB Output is correct
108 Correct 2175 ms 14492 KB Output is correct
109 Correct 1721 ms 12900 KB Output is correct