Submission #743531

#TimeUsernameProblemLanguageResultExecution timeMemory
743531danikoynovHighway Tolls (IOI18_highway)C++14
Compilation error
0 ms0 KiB
#include "highway.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll maxn = 2e5 + 10;
vector < pair < ll, ll > > g[maxn];
ll n, m;
ll a, b;
pair < ll, ll > ed[maxn];

vector < int > turn_active(vector < ll > act)
{
    vector < int > res(m, 1);
    for (ll v : act)
        res[v] = 0;
    return res;
}
vector < int > turn_inactive(vector < ll > act)
{
    vector < int > res(m, 0);
    for (ll v : act)
        res[v] = 1;
    return res;
}
ll mark[maxn], from[maxn], dis[maxn];
ll used[maxn];
ll sub_solve(ll s, vector < ll > st, ll sum)
{
    for (ll i = 0; i < n; i ++)
        used[i] = 1e9;
    for (ll v : st)
        used[v] = -1;
    used[s] = 0;
    queue < ll > q;
    q.push(s);
    from[s] = -1;
    vector < ll > d;
    vector < ll > base;
    ///exit(0);
    while(!q.empty())
    {
        ll v = q.front();
        q.pop();
        d.push_back(v);
        for (pair < ll, ll > nb : g[v])
        {
            if (used[nb.first] == -1)
            {
                used[nb.first] = used[v] + 1;
                from[nb.first] = nb.second;
                base.push_back(nb.second);
                q.push(nb.first);
            }
        }
    }

    ll lf = 1, rf = (ll)(d.size()) - 1;
    while(lf <= rf)
    {
        ll mf = (lf + rf) / 2;
        vector < ll > cur_set;
        for (ll i = max((ll)(1),mf); i < d.size(); i ++)
            cur_set.push_back(from[d[i]]);
        if (ask(turn_inactive(cur_set)) != sum)
            lf = mf + 1;
        else
            rf = mf - 1;
    }
    return d[rf];
}

void find_pair(ll N, vector<ll> U, vector<ll> V, ll A, ll B)
{
    n = N;
    m = U.size();
    a = A;
    b = B;
    for (ll i = 0; i < m; i ++)
    {
        g[U[i]].push_back({V[i], i});
        g[V[i]].push_back({U[i], i});
        ed[i] = {U[i], V[i]};
    }


    vector < ll > act;
    for (ll i = 0; i < m; i ++)
    act.push_back(i);

    ll base_sum = ask(turn_active(act));
    ll num_edges = base_sum / (ll)(A);
    while(act.size() > 1)
    {
        vector < ll > lf, rf;
        for (ll i = 0; i < act.size() / 2; i ++)
            lf.push_back(act[i]);
        for (ll i = act.size() / 2; i < act.size(); i ++)
            rf.push_back(act[i]);

        if (ask(turn_active(lf)) != num_edges * (ll)(B))
            act = lf;
        else
            act = rf;
    }

    ll edge = act[0];
    ///cout << "here " << edge << endl;
    ll v = V[edge], u = U[edge];

    queue < ll > q;
    mark[v] = 1;
    mark[u] = 2;
    q.push(v);
    q.push(u);
    while(!q.empty())
    {
        ll cur = q.front();
        q.pop();
        ///cout << cur << " : " << mark[cur] << endl;
        for (pair < ll, ll > nb : g[cur])
        {
            if (mark[nb.first] == 0)
            {
                mark[nb.first] = mark[cur];
                q.push(nb.first);
            }
        }
    }
    vector < ll > set_s, set_t;
    for (ll i = 0; i < n; i ++)
    {
        if (mark[i] == 1)
            set_s.push_back(i);
        else
            set_t.push_back(i);
    }
    ll S = sub_solve(v, set_s, base_sum), T = sub_solve(u, set_t, base_sum);
    ///cout << S << " " << T << " : " << v << " " << u << endl;
    answer(S, T);
}

Compilation message (stderr)

highway.cpp: In function 'll sub_solve(ll, std::vector<long long int>, ll)':
highway.cpp:63:40: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |         for (ll i = max((ll)(1),mf); i < d.size(); i ++)
      |                                      ~~^~~~~~~~~~
highway.cpp: In function 'void find_pair(ll, std::vector<long long int>, std::vector<long long int>, ll, ll)':
highway.cpp:96:26: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |         for (ll i = 0; i < act.size() / 2; i ++)
      |                        ~~^~~~~~~~~~~~~~~~
highway.cpp:98:39: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |         for (ll i = act.size() / 2; i < act.size(); i ++)
      |                                     ~~^~~~~~~~~~~~
/usr/bin/ld: /tmp/ccPavQ2B.o: in function `main':
grader.cpp:(.text.startup+0x16c): undefined reference to `find_pair(int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >, int, int)'
collect2: error: ld returned 1 exit status