제출 #1333666

#제출 시각아이디문제언어결과실행 시간메모리
1333666Muhammad_Aneeq통행료 (IOI18_highway)C++17
6 / 100
74 ms20892 KiB
#include "highway.h"
#include "bits/stdc++.h"
using namespace std;
#define ll long long
int const MAXN=1e5+10;
vector<pair<int,int>>nei[MAXN];
vector<int>ver[MAXN]={};
int h[MAXN],P[MAXN],ind[MAXN];
void dfs(int u,int p=-1)
{
    // cout<<u<<' '<<p<<endl;
    P[u]=p;
    ver[h[u]].push_back(u);
    for (auto [v,i]:nei[u])
    {
        if (v==p)
        {
            ind[u]=i;continue;
        }
        h[v]=h[u]+1;
        dfs(v,u);
    }
}
void find_pair(int N, vector<int> U, vector<int> V, int A, int B) 
{
    int M=U.size();
    for (int i=0;i<M;i++)
    {
        nei[U[i]].push_back({V[i],i});
        nei[V[i]].push_back({U[i],i});
    }
    h[1]=0;
    P[1]=-1;
    dfs(1);
    vector<int>w;
    for (int i=0;i<M;i++)
        w.push_back(0);
    ll mn=ask(w);
    ll dis=mn/A;
    int mx=0;
    while (ver[mx].size())
        mx++;
    mx--;
    int st=0,en=mx+1;
    while (st+1<en)
    {
        for (int i=0;i<M;i++)
            w[i]=0;
        int mid=(st+en)/2;
        for (int i=mid;i<=mx;i++)
        {
            for (auto j:ver[i])
                w[ind[j]]=1;
        }
        ll cur=ask(w);
        if (cur!=mn)
            st=mid;
        else
            en=mid;
    }
    int dh=st;
    int sz=ver[st].size();
    st=-1,en=sz-1;
    while (st+1<en)
    {
        int mid=(st+en)/2;
        for (int i=0;i<M;i++)
            w[i]=0;
        for (int j=0;j<=mid;j++)
            w[ind[ver[dh][j]]]=1;
        ll cur=ask(w);
        if (cur!=mn)
            en=mid;
        else
            st=mid;
    }
    int s=ver[dh][en];
    int t;
    st=-1,en=mx;
    while (st+1<en)
    {
        for (int i=0;i<M;i++)
            w[i]=0;
        int mid=(st+en)/2;
        for (int i=0;i<=mid;i++)
        {
            for (auto j:ver[i])
                w[ind[j]]=1;
        }
        ll cur=ask(w);
        if (cur!=mn)
            en=mid;
        else
            st=mid;
    } 
    int lch=st;
    int ud=lch+dis-(dh-lch);
    if  (ud==lch)
    {
        t=s;
        while (h[t]!=ud)
            t=P[t];
        answer(s,t);
        return;
    }
    int sm=0;
    {
        int sz=ver[ud].size();
        if (ud<0)
        {
            answer(0,0);
            return;
        }
        int st=0,en=sz;
        while (st+1<en)
        {
            for (int i=0;i<M;i++)
                w[i]=0;
            int mid=(st+en)/2;
            for (int i=mid;i<sz;i++)
                w[ind[ver[ud][i]]]=1;
            ll cur=ask(w);
            if (cur!=mn)
                st=mid;
            else
                en=mid;
        }
        sm=ver[ud][st];
        st=-1,en=sz-1;
        while (st+1<en)
        {
            for (int i=0;i<M;i++)
                w[i]=0;
            int mid=(st+en)/2;
            for (int i=0;i<=mid;i++)
                w[ind[ver[ud][i]]]=1;
            ll cur=ask(w);
            if (cur!=mn)
                en=mid;
            else
                st=mid;
        }
        sm+=ver[ud][en];
        t=s;
        while (h[t]!=ud)
            t=P[t];
        t=sm-t;
    }
    answer(s,t);
}
#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...