Submission #292271

#TimeUsernameProblemLanguageResultExecution timeMemory
292271SamAndHighway Tolls (IOI18_highway)C++17
51 / 100
299 ms262148 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
#define m_p make_pair
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
typedef long long ll;
const int N = 100005;

int n, m;
vector<int> g[N];
vector<int> gi[N];

int d[N];
int u[N];
void dfs0(int x, int p)
{
    if (x == p)
        d[x] = 0;
    for (int i = 0; i < g[x].size(); ++i)
    {
        int h = g[x][i];
        if (h == p)
        {
            u[x] = gi[x][i];
            continue;
        }
        d[h] = d[x] + 1;
        dfs0(h, x);
    }
}

void find_pair(int N_, std::vector<int> U, std::vector<int> V, int A, int B)
{
    n = N_;
    m = sz(U);
    for (int i = 0; i < m; ++i)
    {
        int x = U[i];
        int y = V[i];
        g[x].push_back(y);
        g[y].push_back(x);
        gi[x].push_back(i);
        gi[y].push_back(i);
    }

    vector<int> v;
    v.assign(m, 0);
    int dd = ask(v) / A;

    dfs0(0, 0);
    int maxu = 0;
    for (int x = 0; x < n; ++x)
        maxu = max(maxu, d[x]);
    int l = 1, r = maxu;
    int ans;
    while (l <= r)
    {
        int mid = (l + r) / 2;
        v.assign(m, 0);
        for (int x = 0; x < n; ++x)
        {
            if (d[x] >= mid)
            {
                v[u[x]] = 1;
            }
        }
        if (ask(v) != dd * 1LL * A)
        {
            ans = mid;
            l = mid + 1;
        }
        else
        {
            r = mid - 1;
        }
    }

    vector<int> t;
    for (int x = 0; x < n; ++x)
    {
        if (d[x] == ans)
        {
            t.push_back(x);
        }
    }
    int ans1;
    {
        int l = 0, r = sz(t) - 1;
        int ans;
        while (l <= r)
        {
            int mid = (l + r) / 2;
            v.assign(m, 0);
            for (int i = 0; i <= mid; ++i)
            {
                v[u[t[i]]] = 1;
            }
            if (ask(v) != dd * 1LL * A)
            {
                ans = t[mid];
                r = mid - 1;
            }
            else
                l = mid + 1;
        }
        ans1 = ans;
    }

    dfs0(ans1, ans1);
    t.clear();
    for (int x = 0; x < n; ++x)
    {
        if (d[x] == dd)
        {
            t.push_back(x);
        }
    }
    int ans2;
    {
        int l = 0, r = sz(t) - 1;
        int ans;
        while (l <= r)
        {
            int mid = (l + r) / 2;
            v.assign(m, 0);
            for (int i = 0; i <= mid; ++i)
            {
                v[u[t[i]]] = 1;
            }
            if (ask(v) != dd * 1LL * A)
            {
                ans = t[mid];
                r = mid - 1;
            }
            else
                l = mid + 1;
        }
        ans2 = ans;
    }
    answer(ans1, ans2);
}

Compilation message (stderr)

highway.cpp: In function 'void dfs0(int, int)':
highway.cpp:22:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   22 |     for (int i = 0; i < g[x].size(); ++i)
      |                     ~~^~~~~~~~~~~~~
highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:143:11: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
  143 |     answer(ans1, ans2);
      |     ~~~~~~^~~~~~~~~~~~
highway.cpp:143:11: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
highway.cpp:84:9: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
   84 |         if (d[x] == ans)
      |         ^~
#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...