제출 #1082186

#제출 시각아이디문제언어결과실행 시간메모리
1082186TlenekWodoru통행료 (IOI18_highway)C++17
90 / 100
186 ms11628 KiB
#include<bits/stdc++.h>
#include "highway.h"
using namespace std;
struct Edge
{
    int b,c;
};
vector<Edge>D[90009];
int n,m;
long long DeafOdl;
vector<int>DeafQuery;
vector<int>BFS(int s)
{
    vector<int>ODL(n,-1);
    ODL[s]=0;
    deque<int>Y={s};
    vector<int>W;
    while((int)Y.size()>0)
    {
        const int v=Y[0];
        Y.pop_front();
        W.push_back(v);
        for(auto[som,ind] : D[v])
        {
            if(ODL[som]==-1)
            {
                ODL[som]=ODL[v]+1;
                Y.push_back(som);
            }
        }
    }
    return W;
}
int BinSearch()
{
    int l=0,p=n-1;
    while(l<p)
    {
        const int mid=(l+p+1)>>1;
        vector<int>Query(m);
        for(int i=mid;i<n;i++)
        {
            for(auto[som,ind] : D[i])
            {
                Query[ind]=1;
            }
        }
        if(ask(Query)!=DeafOdl)
        {
            l=mid;
        }
        else
        {
            p=mid-1;
        }
    }
    return l;
}
int BinSearch2(int s)
{
    vector<int>W=BFS(s);
    int l=0,p=n-1;
    while(l<p)
    {
        const int mid=(l+p+1)>>1;
        vector<int>Query=DeafQuery;
        for(int i=mid;i<n;i++)
        {
            for(auto[som,ind] : D[W[i]])
            {
                Query[ind]=1;
            }
        }
        if(ask(Query)!=DeafOdl)
        {
            l=mid;
        }
        else
        {
            p=mid-1;
        }
    }
    return W[l];
}
void find_pair(int N, vector<int>E1, vector<int>E2, int A, int B)
{
    n=N;
    m=E1.size();
    for(int i=0;i<m;i++)
    {
        D[E1[i]].push_back({E2[i],i});
        D[E2[i]].push_back({E1[i],i});
    }
    DeafOdl=ask(vector<int>(m));
    int u=BinSearch();
    DeafQuery.resize(m);
    for(int i=u+1;i<n;i++)
    {
        for(auto[som,ind] : D[i])
        {
            DeafQuery[ind]=1;
        }
    }
    int a=BinSearch2(u);
    int b=BinSearch2(a);
    if(a>b){swap(a,b);}
    //cout<<"a="<<a<<" b="<<b<<" u="<<u<<" DeafOdl="<<DeafOdl<<endl;
    answer(a,b);
}
#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...