Submission #1254798

#TimeUsernameProblemLanguageResultExecution timeMemory
1254798heozremix다리 (APIO19_bridges)C++20
100 / 100
2620 ms6264 KiB
#include <bits/stdc++.h>

#define ll long long
#define pii pair <int ,int >
#define fi first
#define se second
#define all(dataStructure) dataStructure.begin(), dataStructure.end()
using namespace std;

const int N = 1e5;
const ll inf32 = 1e9;
const ll inf64 = 1e18;
const int LOG = 26;
const int BLOCK = 400;
const int base = 3e7;

int n , m , q;
int type[N + 5] , x[N + 5] , y[N + 5];
int u[N + 5] , v[N + 5] , w[N + 5];
int ans[N + 5];
int Musashi_Miyamoto[N + 5] , Sasaki_Kojiro[N + 5] , cntA , cntB;
bool isChange[N + 5];
vector < int > FitChange[BLOCK + 5] , Query;

void init() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(nullptr); std::cout.tie(nullptr);

    #define TASK "Bridges"
    if (fopen(TASK".INP", "r")) {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }
}

struct DSU
{
    int lab[N + 5];
    pii history[2 * N + 5];
    int id = 0;
    void resz(int nn){
        for(int i = 1 ; i <= nn ; i ++) lab[i] = -1;
        id = 0;
    }
    int find_set(int u){
        return lab[u] < 0 ? u : find_set(lab[u]);
    }
    void join(int u , int v)
    {
        u = find_set(u);
        v = find_set(v);
        if(u == v) return;
        if(lab[u] > lab[v]) swap(u , v);
        history[++id] = {u , lab[u]};
        history[++id] = {v , lab[v]};
        lab[u] += lab[v];
        lab[v] = u;
        return;
    }
    void rollback(int past)
    {
        while(id > past)
        {
            lab[history[id].fi] = history[id].se;
            id --;
        }
    }
} dsu;

void process() {
    for(int l = 1 ; l <= q ; l += BLOCK)
    {
        int r = min(l + BLOCK - 1 , q);
        //reset
        dsu.resz(n + 2);    cntA = cntB = 0;
        Query.clear();
        //pre process
        for(int i = l ; i <= r ; i ++)
        {
            if(type[i] == 1) isChange[x[i]] = true;
            else Query.emplace_back(i);
            FitChange[i - l].clear();
        }
        for(int i = 1 ; i <= m ; i ++)
        {
            if(isChange[i]) Musashi_Miyamoto[++cntA] = i;
            else Sasaki_Kojiro[++cntB] = i;
        }
        sort(Sasaki_Kojiro + 1 , Sasaki_Kojiro + cntB + 1 , [](int i , int j) {
            return w[i] > w[j];
        });
        sort(all(Query) , [](int i , int j){
            return y[i] > y[j];
        });

        for(int i = l ; i <= r ; i ++)
        {
            if(type[i] == 1) w[x[i]] = y[i];
            else
            {
                for(int j = 1 ; j <= cntA ; j ++)
                    if(w[Musashi_Miyamoto[j]] >= y[i])
                        FitChange[i - l].emplace_back(Musashi_Miyamoto[j]);
            }
        }
        int j = 1;
        for(int i : Query)
        {
            while(j <= cntB && w[Sasaki_Kojiro[j]] >= y[i])
            {
                dsu.join(u[Sasaki_Kojiro[j]], v[Sasaki_Kojiro[j]]);
                j++;
            }

            int timeline = dsu.id;
            for(int e : FitChange[i - l])
                dsu.join(u[e] , v[e]);
            ans[i] = dsu.lab[dsu.find_set(x[i])];
            dsu.rollback(timeline);
        }

        for(int i = l ; i <= r ; i ++) if(type[i] == 1) isChange[x[i]] = false;
    }
    for(int i = 1 ; i <= q ; i ++) if(type[i] == 2) cout << 0 - ans[i] << '\n';
}

void read() {
    cin >> n >> m;
    for(int i = 1 ; i <= m ; i ++) cin >> u[i] >> v[i] >> w[i];
    cin >> q;
    for(int i = 1 ; i <= q ; i ++) cin >> type[i] >> x[i] >> y[i];
}

int main() {
    init();
    int test_case;
    //cin >> test_case;
    test_case = 1;
    while (test_case--) {
        read();
        process();
    }
    return 0;
}

Compilation message (stderr)

bridges.cpp: In function 'void init()':
bridges.cpp:31:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   31 |         freopen(TASK".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:32:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   32 |         freopen(TASK".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...