제출 #1193679

#제출 시각아이디문제언어결과실행 시간메모리
1193679Bui_Quoc_Cuong다리 (APIO19_bridges)C++20
0 / 100
1 ms324 KiB
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int SQRT = 400;
#define ALL(A) A.begin(), A.end()

int n, m, q;
struct Edges{
    int u, v, w;
} E[N];
struct Queries{
    int t, u, w;
} Q[N];

struct DisjointSet{
    int lab[N]; 

    struct Data{
        int u, lu, v, lv;
    }; stack <Data> memo;

    int find(int x){
        return lab[x] < 0 ? x : find(lab[x]);
    }

    bool joint(int u, int v){
        int x = find(u), y = find(v);
        if(x == y) return 0;
        if(lab[x] > lab[y]) swap(x, y);

        memo.push({x, lab[x], y, lab[y]});

        lab[x]+= lab[y];
        lab[y] = x;

        return 1;
    }   

    int vers(){
        return memo.size();
    }

    void rollback(int sz){
        while((int)memo.size() > sz){
            lab[memo.top().u] = memo.top().lu;
            lab[memo.top().v] = memo.top().lv;
            memo.pop();
        }
    }

    void clear() {
        for(int i = 1; i <= n; i++){
            lab[i]=-1;
        }
        while(!memo.empty()){
            memo.pop();
        }
    }
} DSU;

bool inQuer[N];
int last[N];
int ans[N];

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #define KO ""
    freopen(KO".inp", "r", stdin);
    freopen(KO".out", "w", stdout);

    cin >> n >> m;
    for(int i = 1; i <= m; i++){
        cin >> E[i].u >> E[i].v >> E[i].w;
    }
    cin >> q;
    for(int i = 1; i <= q; i++){
        cin >> Q[i].t >> Q[i].u >> Q[i].w;
    }

    for(int L = 1; L <= q; L+= SQRT){
        int R = min(q, L + SQRT - 1);

        for(int i = L; i <= R; i++){
            if(Q[i].t == 1){
                inQuer[Q[i].u] = 1;
            }
        }

        vector <int> qry, joint, no_joints;

        for(int i = 1; i <= m; i++){
            if(inQuer[i] == 0){
                no_joints.push_back(i);
            } else{
                joint.push_back(i);
            }
        }

        for (int i = L; i <= R; i++){
            if(Q[i].t == 2){
                qry.push_back(i);
            }
        }

        DSU.clear();

        sort(ALL(no_joints), [&](int u, int v){
            return E[u].w > E[v].w;
        });
        sort(ALL(qry), [&](int u, int v){
            return Q[u].w > Q[v].w;
        });

        int it = 0;

        for(const int &id : qry){
            while(it <= (int)no_joints.size() - 1 && E[no_joints[it]].w >= Q[id].w){
                DSU.joint(E[no_joints[it]].u, E[no_joints[it]].v);
                it++;
            }       

            int ver = DSU.vers();

            for(int i = L; i < id; i++){
                if(Q[i].t == 1){
                    last[Q[i].u] = i;
                }                
            }   

            for(const int &x : joint){
                if(last[x]){
                    if(Q[last[x]].w >= Q[id].w){
                        DSU.joint(E[x].u, E[x].v);
                    }
                } else{
                    if(E[x].w >= Q[id].w){
                        DSU.joint(E[x].u, E[x].v);
                    }
                }
            }

            ans[id] = - DSU.lab[DSU.find(Q[id].u)];

            DSU.rollback(ver);

            for(auto x : joint){
                last[x] = 0;
            }
        }

        for(int i = L; i <= R; i++){
            if(Q[i].t == 1){
                E[Q[i].u].w = Q[i].w;
            }
        }
        for(int i = 1; i <= m; i++){
            inQuer[i] = 0;
        }
    }   

    for(int i = 1; i <= q; i++) if(Q[i].t == 2){
        cout << ans[i] << "\n";
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

bridges.cpp: In function 'int main()':
bridges.cpp:68:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |     freopen(KO".inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:69:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |     freopen(KO".out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...