제출 #292617

#제출 시각아이디문제언어결과실행 시간메모리
292617egekabas통행료 (IOI18_highway)C++14
13 / 100
312 ms262148 KiB
#include "highway.h"
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<ll, ll> pii;
typedef pair<ld, ld> pld;
vector<pii> g[90000];
ll bl[90000];
ll sz[90000];

void findsz(ll v, ll prt){
    sz[v] = 1;
    for(auto u : g[v]){
        if(bl[u.ff] || u.ff == prt) continue;
        findsz(u.ff, v);
        sz[v] += sz[u.ff];
    }
}
ll findcentroid(ll v, ll prt, ll n){
    for(auto u : g[v]){
        if(bl[u.ff] || u.ff == prt) continue;
        if(2*sz[u.ff] > n)
            return findcentroid(u.ff, v, n);
    }
    return v;
}
vector<pii> vec;
void get(ll v, ll prt, ll d, ll need){
    if(need == -1 || d >= need)
        vec.pb({v, prt});
    for(auto u : g[v]){
        if(bl[u.ff] || u.ss == prt) continue;
        get(u.ff, u.ss, d+1, need);
    }
}
ll begval = 0;
vector<int> w;
vector<pii> cand;
ll binsearch(ll dont){
    ll l = 0, r = cand.size()-1;
    while(l < r){
        ll m = (l+r)/2;
        vec.clear();
        for(ll i = l; i <= m; ++i)
            if(cand[i].ff != dont){
                get(cand[i].ff, cand[i].ss, 0, -1);
            }
        for(auto u : vec)
            w[u.ss] = 1;
        if(ask(w) != begval)
            r = m;
        else
            l = m+1;
        for(auto u : vec)
            w[u.ss] = 0;
    }
    return l;
}
ll n;

ll binval(){
    ll l = 0, r = cand.size()-1;
    while(l < r){
        ll m = (l+r)/2;
        for(ll i = l; i <= m; ++i)
            w[cand[i].ss] = 1;
        if(ask(w) != begval)
            r = m;
        else
            l = m+1;
        for(ll i = l; i <= m; ++i)
            w[cand[i].ss] = 0;
    }
    return cand[l].ff;
}
ll a, b;

ll getans(pii v1, ll root){
    vec.clear();
    get(v1.ff, v1.ss, 0, -1);
    for(auto u : vec)
        w[u.ss] = 1;
    ll d1 = (ask(w)-begval)/(b-a);
    if(d1 == 0)
        return root;
    for(auto u : vec)
        w[u.ss] = 0;
    vec.clear();
    get(v1.ff, v1.ss, 0, d1-1);
    cand = vec;
    ll ans1 = binval();
    vec.clear();
    return ans1;
}
int cnt = 0;
void calc(ll root){
    ++cnt;
    assert(cnt <= 100);
    findsz(root, -1);
    root = findcentroid(root, -1, sz[root]);
    assert(bl[root] == 0);
    ll newval;
    for(auto u : g[root])
        if(!bl[u.ff])
            w[u.ss] = 1;
    newval = ask(w);
    for(auto u : g[root])
        if(!bl[u.ff])
            w[u.ss] = 0;
    if(newval == begval){
        cand.clear();
        for(auto u : g[root])
            if(!bl[u.ff])
                cand.pb(u);
        ll newroot = cand[binsearch(-1)].ff;
        bl[root] = 1;
        calc(newroot);
    }
    else{
        cand.clear();
        for(auto u : g[root])
            if(!bl[u.ff]){
                cand.pb(u);
            }
        pii v1 = cand[binsearch(-1)];
        pii v2 = cand[binsearch(v1.ff)];
        answer(getans(v1, root), getans(v2, root));
        return;
    }
}
void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
    w.resize(U.size());
    n = N;
    a = A;
    b = B;
    for(ll i = 0; i < U.size(); ++i){
        g[U[i]].pb({V[i], i});
        g[V[i]].pb({U[i], i});
    }
    begval = ask(w);
    calc(0);
}   

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

highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:145:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 |     for(ll i = 0; i < U.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...
#Verdict Execution timeMemoryGrader output
Fetching results...