Submission #1005846

#TimeUsernameProblemLanguageResultExecution timeMemory
1005846irmuunHighway Tolls (IOI18_highway)C++17
12 / 100
260 ms262144 KiB
#include<bits/stdc++.h>
#include "highway.h"
 
using namespace std;
 
#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

const int maxn=9e4+5;

int n,m,a,b;
vector<int>u,v;

vector<pair<int,int>>adj[maxn];
vector<int>par(maxn,0),dep(maxn,0),edge(maxn,0),w;
vector<bool>used(maxn);

void dfs(int x,int p){
    par[x]=p;
    for(auto [y,e]:adj[x]){
        if(y!=p){
            dep[y]=dep[x]+1;
            edge[y]=e;
            dfs(y,x);
        }
    }
}


void find_pair(int N,vector<int>U,vector<int>V,int A, int B){
    n=N,u=U,v=V,a=A,b=B;
    m=u.size();
    w.resize(m);
    fill(all(w),0);
    for(int i=0;i<m;i++){
        adj[u[i]].pb({v[i],i});
        adj[v[i]].pb({u[i],i});
    }
    ll C=ask(w);
    dep[0]=0;
    dfs(0,-1);
    vector<int>ver;
    for(int i=1;i<n;i++){
        if((ll)dep[i]*(ll)a==C){
            ver.pb(i);
        }
    }
    int l=0,r=ver.size()-1;
    while(l<r){
        int mid=(l+r)/2;
        fill(all(w),0);
        for(int i=0;i<=mid;i++){
            w[edge[ver[i]]]=1;
        }
        ll cost=ask(w);
        if(cost>C){
            r=mid;
        }
        else{
            l=mid+1;
        }
    }
    answer(0,ver[l]);
    return;
}
#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...