Submission #742775

#TimeUsernameProblemLanguageResultExecution timeMemory
742775speedyArda다리 (APIO19_bridges)C++14
27 / 100
213 ms13436 KiB
#include "bits/stdc++.h"

using namespace std;
const int MAXN = 1e5+5;
vector< vector< pair<int, int> > > adj(MAXN);
vector< pair<int, pair<int, int> > > edges;
vector<bool> visited(MAXN);
int par[MAXN], sz[MAXN];
int find(int v)
{
    if(par[v] == v)
        return v;
    return par[v] = find(par[v]);
}
void merge(int a, int b)
{
    a = find(a), b = find(b);
    if(a == b)
        return;
    if(sz[a] < sz[b])
        swap(a, b);
    par[b] = a;
    sz[a] += sz[b];
}
int dfs(int v, int weight, int p)
{
    int ans = 1;
    visited[v] = true;
    for(pair<int, int> e : adj[v])
    {
        if(visited[e.first] || e.second < weight)
            continue;
        ans += dfs(e.first, weight, v);
    }
    return ans;
}
int main() 
{
    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        int f, s, w;
        cin >> f >> s >> w;
        adj[f].push_back({s, w});
        adj[s].push_back({f, w});
        edges.push_back({w, {f, s}});
    }
    
    int q;
    cin >> q;
    if(max(m, n) <= 1000 && q <= 10000) // Subtask 1
    {
        for(int i = 1; i <= q; i++)
        {
            int f, s, t;
            cin >> f >> s >> t;
            if(f == 1)
            {
                s--;
                int from = edges[s].second.first, to = edges[s].second.second;
                for(int l = 0; l < adj[from].size(); l++)
                {
                    if(adj[from][l].first == to && adj[from][l].second == edges[s].first) {
                        adj[from][l].second = t;
                        break;
                    }
                }
                for(int l = 0; l < adj[to].size(); l++)
                {
                    if(adj[to][l].first == from && adj[to][l].second == edges[s].first) {
                        adj[to][l].second = t;
                        break;
                    }
                }
                edges[s].first = t;
            } else 
            {
                for(int i = 0; i <= n; i++)
                    visited[i] = false;
                int ans = dfs(s, t, -1);
                cout << ans << "\n";
            }
        }
    } else //Subtask 4
    {
        for(int i = 1; i <= n; i++)
        {
            sz[i] = 1;
            par[i] = i;
        }
        sort(edges.begin(), edges.end());
        reverse(edges.begin(), edges.end());
        int idx = 0;
        vector< pair<int, pair<int, int> > > queries;
        vector<int> ans(q+5, 0);
        for(int i = 1; i <= q; i++)
        {
            int f, s, t;
            cin >> f >> s >> t;
            queries.push_back({t, {s, i}});
        }
        sort(queries.begin(), queries.end());
        reverse(queries.begin(), queries.end());
        for(int i = 0; i < q; i++)
        {
            while(idx < m && edges[idx].first >= queries[i].first)
            {
                merge(edges[idx].second.first, edges[idx].second.second);
                idx++;
            }
            ans[queries[i].second.second] = sz[find(queries[i].second.first)];
            
        }
        for(int i = 1; i <= q; i++)
            cout << ans[i] << "\n";
    }
}

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:62:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |                 for(int l = 0; l < adj[from].size(); l++)
      |                                ~~^~~~~~~~~~~~~~~~~~
bridges.cpp:69:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |                 for(int l = 0; l < adj[to].size(); l++)
      |                                ~~^~~~~~~~~~~~~~~~
#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...