제출 #1299226

#제출 시각아이디문제언어결과실행 시간메모리
1299226adscoding다리 (APIO19_bridges)C++20
0 / 100
3097 ms73792 KiB
#include <bits/stdc++.h>
#define time() cerr << " \n " << "Time : " << 1000.0 * clock() / CLOCKS_PER_SEC << "ms."
#define FOR(i, a, b) for (int i = a, _b = b; i <= _b; ++i)
#define FORD(i, a, b) for (int i = a, _b = b; i >= _b; --i)
#define all(x) x.begin(), x.end()
#define uni(x) x.erase(unique(all(x)), x.end())
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define dbg(...) cerr << "[ " << #__VA_ARGS__ << " ] = ", debug(__VA_ARGS__)
template<typename T> void debug(T x) { cerr << x << "\n\n"; }
template<typename T, typename... Args> void debug(T x, Args... args) { cerr << x << " , ", debug(args...); }


// --------------------------------------------------------------------------------------------------------------------

const int maxn = 5e4 + 3;
int n, m, q;

// --------------------------------------------------------------------------------------------------------------------

// Co the khong lien thong, co the co canh trung

struct Ed
{
    int u, v, w, id;
    Ed() {}
    Ed(int u, int v, int w) : u(u), v(v), w(w) {}

    bool operator < (const Ed &other) const
    {
        return w > other.w;
    }
};

struct Qr
{
    int op, x, y;
};

Ed Feds[100005];
vector<Ed> eds;
Qr qrs[100005];
int lst[100005], ID[100005];

multiset<Ed> tree[100005 << 2];

struct DSU
{
    vector<int> e;
    vector<pair<int &, int>> history;

    void init() {e.assign(n + 3, -1);}
    int get(int u) {return e[u] < 0 ? u : get(e[u]);}
    bool unite(int u, int v)
    {
        u = get(u); v = get(v);
        if (u == v) return false;
        if (e[u] > e[v]) swap(u, v);
        history.push_back({e[u], e[u]});
        history.push_back({e[v], e[v]});
        e[u] += e[v];
        e[v] = u;
        return true;
    }

    void rollback(int until)
    {
        while (history.size() > until)
        {
            history.back().first = history.back().second;
            history.pop_back();
        }
    }
} dsu;


void updEd(int id, int l, int r, int u, int v, Ed ed)
{
    if (l > v || r < u) return;
    if (l >= u && r <= v) return void(tree[id].insert(ed));
    int mid = l + r >> 1;
    updEd(id << 1, l, mid, u, v, ed);
    updEd(id << 1 | 1, mid + 1, r, u, v, ed);
}

void build(int id, int l, int r)
{
    if (l == r) return void(ID[l] = id);
    int mid = l + r >> 1;
    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);
}

bool cmpE(const Ed &x, const Ed &y)
{
    return x.w > y.w;
}


void solve()
{
    cin >> n >> m;
    FOR(i, 1, m)
    {
        cin >> Feds[i].u >> Feds[i].v >> Feds[i].w;
        if (Feds[i].u > Feds[i].v) swap(Feds[i].u, Feds[i].v);
        lst[i] = 0;
    }
    dsu.init();

    cin >> q;
    build(1, 0, q);

    FOR(iq, 1, q)
    {
        cin >> qrs[iq].op >> qrs[iq].x >> qrs[iq].y;
        if (qrs[iq].op == 1)
        {
            int id = qrs[iq].x, val = qrs[iq].y;
            updEd(1, 0, q, lst[id], iq - 1, Ed(Feds[id].u, Feds[id].v, Feds[id].w));
            lst[id] = iq;   
            Feds[id].w = val;
        }
    }

    // Add edge until the last
    FOR(id, 1, m)
    {
        updEd(1, 0, q, lst[id], q, Ed(Feds[id].u, Feds[id].v, Feds[id].w));
    }

    FOR(iq, 1, q << 2)
    {
        if (tree[iq].empty()) continue;

        vector<Ed> vecDel;
        auto it = tree[iq].begin();
        for (; it != tree[iq].end(); ++it)
        {
            if (!dsu.unite(it->u, it->v))
            {
                vecDel.push_back(*it);
            }
        }

        for (Ed ed : vecDel) tree[iq].erase(tree[iq].find(ed));
        

        dsu.rollback(0);
    }

    FOR(iq, 1, q)
    {
        if (qrs[iq].op == 1) continue;
        int id = ID[iq], S = qrs[iq].x, cur_w = qrs[iq].y;
        while (id)
        {
            for (Ed ed : tree[id])
            {
                if (ed.w < cur_w) break;
                dsu.unite(ed.u, ed.v);
            }
            id >>= 1;
        }

        cout << -dsu.e[dsu.get(S)] << '\n';

        dsu.rollback(0);
    }
}

signed main()
{
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    #define TASK "test"
    if (fopen(TASK".INP", "r"))
    {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }
    solve();
    time();
    return 0;
}

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

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