Submission #1078074

#TimeUsernameProblemLanguageResultExecution timeMemory
1078074woodHighway Tolls (IOI18_highway)C++17
51 / 100
85 ms9620 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> p32;
typedef pair<ll,ll> p64;
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define vi vector<int>
#define vp32 vector<p32>
#define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
#define MOD %1000000007
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template <class T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
//never guess
//never debug without reviewing code
//never try adding ones or substracting them
//only step by step debug when necessay

int getstart(int u, int v, vp32 adj[], int n, int depth, ll cost){
    int d[n]; memset(d,0,sizeof d);
    d[v] = INT_MAX;
    d[u] = 1;
    queue<int> q; q.push(u);
    int edge[n];
    while(!q.empty()){
        int x = q.front();
        q.pop();
        for(p32 ii : adj[x]){
            if(!d[ii.fi]){
                d[ii.fi] = d[x]+1;
                q.push(ii.fi);
                edge[ii.fi] = ii.se;
            }
        }
    }
    vi possible;
    for(int i = 0; i<n; i++){
        if(d[i]==depth+1) possible.pb(i);
    }
    int l = -1, r = possible.size()-1;
    while(r-l>1){
        int m = (r+l)/2;
        vi w(n-1);
        for(int i = l+1; i<=m; i++) w[edge[possible[i]]] = 1;
        if(ask(w)>cost) r = m;
        else l = m;
    }
    return possible[r];
}

ll setsubtree(int u, int v, vp32 adj[], int n){
    bool done[n]; memset(done,0,sizeof done);
    done[v] = true;
    stack<int> st;
    st.push(u);
    vi w(n-1);
    while(!st.empty()){
        int x = st.top();
        st.pop();
        done[x] = true;
        for(auto ii : adj[x]){
            if(!done[ii.fi]){
                w[ii.se] = 1;
                st.push(ii.fi);
            }
        }
    }
    return ask(w);
}

void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
    int m = U.size(),n = N;
    vp32 adj[n];
    for(int i = 0; i<m; i++){
        adj[U[i]].eb(V[i],i);
        adj[V[i]].eb(U[i],i);
    }
    int l = -1, r = n;
    ll cost = ask(vi(m));
    while(r-l>1){
        int mid = (r + l) / 2;
        vi w(m);
        for(int i = l+1; i <= mid; i++)w[i] = 1;
        if(ask(w)==cost) l = mid;
        else r = mid;
    }
    int ulength = (setsubtree(U[r],V[r],adj,n)-cost)/(B-A);
    int vlength = cost/A-ulength-1;
    answer(getstart(U[r],V[r],adj,n,ulength,cost),getstart(V[r],U[r],adj,n,vlength,cost));
}
#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...