Submission #767165

#TimeUsernameProblemLanguageResultExecution timeMemory
767165danikoynovSimurgh (IOI17_simurgh)C++14
30 / 100
136 ms49456 KiB
#include "simurgh.h"
#include <bits/stdc++.h>

using namespace std;

const int maxn = 510;
struct disjoint_set_union
{
    int par[maxn];

    disjoint_set_union() {};

    disjoint_set_union(int n)
    {
        for (int i = 0; i < n; i ++)
            par[i] = i;
    }

    int find_leader(int v)
    {
        if (v == par[v])
            return v;
        return (par[v] = find_leader(par[v]));
    }

    bool is_connected(int v, int u)
    {
        return find_leader(v) == find_leader(u);
    }

    void unite(int v, int u)
    {
        v = find_leader(v);
        u = find_leader(u);
        if (v == u)
            return;
        par[v] = u;
    }
};

int is_bridge[maxn * maxn];
int direction[maxn * maxn];
vector < pair < int, int > > adj[maxn];
int par[maxn], par_idx[maxn], used[maxn];
int depth[maxn];
void dfs(int v)
{
    used[v] = 1;
    for (pair < int, int > nb : adj[v])
    {
        if (nb.first == par[v])
            continue;
        if (!used[nb.first])
        {
            par_idx[nb.first] = nb.second;
            par[nb.first] = v;
            direction[nb.second] = 1;
            depth[nb.first] = depth[v] + 1;
            dfs(nb.first);
        }
        else
        {
            direction[nb.second] = -1;
        }
    }
}

vector < vector < int > > cycles;
vector < int > gold;
int visit[maxn * maxn], is_gold[maxn * maxn];
vector < int > span;
vector < int > tree;
void trav(int v)
{
    for (pair < int, int > nb : adj[v])
    {
        if (used[nb.first] == 0)
        {
            used[nb.first] = 1;
            tree.push_back(nb.second);
            trav(nb.first);
        }
    }
}
vector<int> find_roads(int n, vector<int> u, vector<int> v)
{
    int m = u.size();
    for (int i = 0; i < m; i ++)
    {
        adj[u[i]].push_back({v[i], i});
        adj[v[i]].push_back({u[i], i});
    }

    par[0] = -1;
    par_idx[0] = -1;
    dfs(0);

    for (int i = 0; i < m; i ++)
    {
            int V = u[i], U = v[i];
        if (direction[i] == -1)
        {
            if (depth[V] < depth[U])
                swap(V, U);
            vector < int > cycle;
            int cur = V;
            while(cur != U)
            {
                visit[par_idx[cur]] = 1;
                cycle.push_back(par_idx[cur]);
                cur = par[cur];

            }
            visit[i] = 1;
            cycle.push_back(i);
            cycles.push_back(cycle);
        }
    }

    for (int i = 0; i < m; i ++)
        if (!visit[i])
    {
        gold.push_back(i);
        span.push_back(i);
        is_gold[i] = 1;
    }

        for (vector < int > cycle : cycles)
        {
            for (int i = 0; i < n; i ++)
                used[i] = 0;
            for (int i = 0; i < cycle.size(); i ++)
            {
                int edge = cycle[i];
            used[v[edge]] = used[u[edge]] = 2;
            }

            tree.clear();
            for (int i = 0; i < n; i ++)
            {
                if (used[i] == 2)
                    trav(i);
            }
            vector < int > values;
            int max_val = -1, min_val = 1e9;
            for (int i = 0; i < cycle.size(); i ++)
            {
                vector < int > res = tree;
                for (int j = 0; j < cycle.size(); j ++)
                {
                    if (i != j)
                        res.push_back(cycle[j]);
                }
                values.push_back(count_common_roads(res));
                max_val = max(max_val, values.back());
                min_val = min(min_val, values.back());
            }

            if (max_val == min_val)
            {
                for (int idx : cycle)
                    is_gold[idx] = -1;
            }
            else
            {
                for (int i = 0; i < cycle.size(); i ++)
                {
                    if (values[i] == min_val)
                        is_gold[cycle[i]] = 1;
                    else
                        is_gold[cycle[i]] = -1;
                }
            }
        }

        vector < int > ans;
        for (int i = 0; i < m; i ++)
            if (is_gold[i] == 1)
            ans.push_back(i);
        return ans;

}

Compilation message (stderr)

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:132:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |             for (int i = 0; i < cycle.size(); i ++)
      |                             ~~^~~~~~~~~~~~~~
simurgh.cpp:146:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  146 |             for (int i = 0; i < cycle.size(); i ++)
      |                             ~~^~~~~~~~~~~~~~
simurgh.cpp:149:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  149 |                 for (int j = 0; j < cycle.size(); j ++)
      |                                 ~~^~~~~~~~~~~~~~
simurgh.cpp:166:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  166 |                 for (int i = 0; i < cycle.size(); i ++)
      |                                 ~~^~~~~~~~~~~~~~
#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...