제출 #892176

#제출 시각아이디문제언어결과실행 시간메모리
892176vjudge1다리 (APIO19_bridges)C++17
100 / 100
2095 ms80532 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fi first
#define se second
#define all(a) (a).begin(), (a).end()
#define pb push_back

#define TASKNAME "NAME"

void init()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    ///freopen(TASKNAME".INP","r",stdin); freopen(TASKNAME".OUT","w",stdout);
}

const int SZ = 1e5+5, BS = 800;
const ll INF = INT_MAX / 2, MOD = 1e9+7, INFLL = 2e18;
const double epsilon = 1e-3;

struct DSU
{
    int lab[SZ];
    vector<pii> save;

    void init(int n)
    {
        for(int i = 1; i <= n; i++)
        {
            lab[i] = -1;
        }
    }

    int get(ll u)
    {
        return (lab[u] < 0 ? u : get(lab[u]));
    }

    void join(int u, int v)
    {
        u = get(u);
        v = get(v);
        if(u == v) return;
        if(lab[u] > lab[v]) swap(u,v);
        save.pb({v, lab[v]});
        lab[u] += lab[v];
        lab[v] = u;
    }

    void undo()
    {
        pii p = save.back();
        int v = p.fi, u = lab[v];
        lab[v] = p.se;
        lab[u] -= lab[v];
        save.pop_back();
    }

    void rollback(int _n)
    {
        while(save.size() > _n) undo();
    }

} dsu;

struct Edge
{
    int u, v, w, id;
};
Edge e[SZ];

struct Query
{
    int t, x, y;
};
Query b[SZ];

int n, m, q, res[SZ];
bool changed[SZ];
vector<int> block, join[SZ];

bool cmp1(int i, int j)
{
    return b[i].y > b[j].y;
}

bool cmp2(int i, int j)
{
    return e[i].w > e[j].w;
}

int main()
{
    init();
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        cin >> e[i].u >> e[i].v >> e[i].w;
        e[i].id = i;
    }
    cin >> q;
    block.pb(0);
    int cnt = 0;
    for(int i = 1; i <= q; i++)
    {
        cin >> b[i].t >> b[i].x >> b[i].y;
        ++cnt;
        if(cnt >= BS)
        {
            cnt = 0;
            block.pb(i);
        }
    }
    block.pb(q);
    for(int k = 0; k < block.size() - 1; k++)
    {
        int lo = block[k] + 1, hi = block[k + 1];
        dsu.init(n);
        vector<int> ask, unstable, unchanged;
        for(int i = lo; i <= hi; i++)
        {
            if(b[i].t == 2)
            {
                ask.pb(i);
            } else
            {
                changed[b[i].x] = true;
                unstable.pb(i);
            }
        }
        for(int i = 1; i <= m; i++)
        {
            if(!changed[i]) unchanged.pb(i);
            changed[i] = false;
        }
        for(int i = lo; i <= hi; i++)
        {
            if(b[i].t == 1)
            {
                e[b[i].x].w = b[i].y;
            } else
            {
                join[i-lo].clear();
                for(int j : unstable)
                {
                    if(e[b[j].x].w >= b[i].y) join[i-lo].pb(b[j].x);
                }
            }
        }
        sort(all(ask), cmp1);
        sort(all(unchanged), cmp2);
        int j = 0;
        for(int i = 0; i < ask.size(); i++)
        {
            int id = ask[i];
            while(j < unchanged.size() && e[unchanged[j]].w >= b[id].y )
            {
                int u = e[unchanged[j]].u, v = e[unchanged[j]].v;
                dsu.join(u,v);
                ++j;
            }
            int prevS = dsu.save.size();
            for(int jj : join[id-lo])
            {
                int u = e[jj].u, v = e[jj].v;
                dsu.join(u,v);
            }
            res[id] = - dsu.lab[ dsu.get(b[id].x) ];
            dsu.rollback(prevS);
        }
    }
    for(int i = 1; i <= q; i++)
    {
        if(b[i].t == 2) cout << res[i] << '\n';
    }
}

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

bridges.cpp: In member function 'void DSU::rollback(int)':
bridges.cpp:66:27: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   66 |         while(save.size() > _n) undo();
      |               ~~~~~~~~~~~~^~~~
bridges.cpp: In function 'int main()':
bridges.cpp:120:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |     for(int k = 0; k < block.size() - 1; k++)
      |                    ~~^~~~~~~~~~~~~~~~~~
bridges.cpp:158:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  158 |         for(int i = 0; i < ask.size(); i++)
      |                        ~~^~~~~~~~~~~~
bridges.cpp:161:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  161 |             while(j < unchanged.size() && e[unchanged[j]].w >= b[id].y )
      |                   ~~^~~~~~~~~~~~~~~~~~
#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...