Submission #799570

#TimeUsernameProblemLanguageResultExecution timeMemory
799570KhizriHighway Tolls (IOI18_highway)C++17
51 / 100
335 ms262144 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define F first
#define S second
#define INF 1e18
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()
#define pii pair<int,int>
#define pll pair<ll,ll>
#define OK cout<<"Ok"<<endl;
#define MOD (ll)(1e9+7)
const int mxn=1e5+5;
int n,m,a,b,mx,sz,dis;
vector<int>que;
vector<pii>vt[mxn];
vector<pii>nodes;
void find_dep(int u,int p,int dep){
    mx=max(mx,dep);
    for(pii pp:vt[u]){
        int v=pp.F;
        if(v!=p){
            find_dep(v,u,dep+1);
        }
    }
}
void dfs(int u,int p,int dep){
    for(pii pp:vt[u]){
        int v=pp.F,idx=pp.S;
        if(v==p) continue;
        if(dep+1<=sz){
            que[idx]=1;
        }
        else{
            que[idx]=0;
        }
        dfs(v,u,dep+1);
    }
}
void add_nodes(int u,int p,int dep){
    for(pii pp:vt[u]){
        int v=pp.F,idx=pp.S;
        if(v!=p){
            if(dep+1==dis) nodes.pb({v,idx});
            add_nodes(v,u,dep+1);
        }
    }
}
ll check(int x){
    sz=x;
    dfs(1,-1,0);
    ll res=ask(que);
    return res;
}
void find_pair(int N, vector<int> ux, vector<int> vx, int A, int B) {
    n=N;
    a=A,b=B;
    m=ux.size();
    for(int i=0;i<m;i++){
        int u=ux[i]+1,v=vx[i]+1;
        vt[u].pb({v,i});
        vt[v].pb({u,i});
    }
    for(int i=0;i<m;i++){
        que.pb(1);
    }
    ll cost=ask(que);
    find_dep(1,-1,0);
    int l=0,r=mx;
    while(l<=r){
        int m=(l+r)/2;
        if(check(m)<cost){
            l=m+1;
        }
        else{
            r=m-1;
        }
    }
    ll cost2=cost/b*a;
    dis=l;
    add_nodes(1,-1,0);
    l=0,r=nodes.size()-1;
    while(l<=r){
        int mm=(l+r)/2;
        for(int i=0;i<m;i++){
            que[i]=0;
        }
        for(int i=l;i<=mm;i++){
            que[nodes[i].S]=1;
        }
        ll res=ask(que);
        if(res>cost2){
            r=mm-1;
        }
        else{
            l=mm+1;
        }
    }
    r++;
    int root=nodes[r].F;
    ll cnt=cost/b;
    nodes.clear();
    dis=cnt;
    add_nodes(root,-1,0);
    l=0,r=nodes.size()-1;
    while(l<=r){
        int mm=(l+r)/2;
        for(int i=0;i<m;i++){
            que[i]=0;
        }
        for(int i=l;i<=mm;i++){
            que[nodes[i].S]=1;
        }
        ll res=ask(que);
        if(res>cost2){
            r=mm-1;
        }
        else{
            l=mm+1;
        }
    }
    r++;
    int root2=nodes[r].F;
    answer(root-1,root2-1);
}
/*
g++ highway.cpp grader.cpp ; .\a.exe
8 7 1 2 5 6
0 1
0 2
1 3
1 4
4 6
6 7
2 5
*/
#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...