제출 #713904

#제출 시각아이디문제언어결과실행 시간메모리
713904victor_gao통행료 (IOI18_highway)C++17
5 / 100
155 ms13452 KiB
#include "highway.h"
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define x first
#define y second
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
vector<pii>g[90015];
vector<int>all[90015];
vector<int>qry;
ll n,m,mx,mn,fa[90015],dep[90015];
void bfs(int root){
    for (int i=0;i<=n;i++){
        fa[i]=0; dep[i]=0; mx=0;
        all[i].clear();
    }
    queue<int>q; q.push(root);
    dep[root]=1; mx=1;
    all[1].push_back(root);
    while (!q.empty()){
        int p=q.front(); q.pop();
        for (auto [i,idx]:g[p]){
            if (!dep[i]){
                dep[i]=dep[p]+1; fa[i]=idx; mx=max(mx,dep[i]);
                all[dep[i]].push_back(i);
                q.push(i);
            }
        }
    }
}
int solve1(int root){
    bfs(root);
    int l=2,r=mx+1;
    while (l<r){
        int mid=(l+r)>>1;
        for (auto i:all[mid])
            qry[fa[i]]=1;
        int dis=ask(qry);
        if (dis==mn) r=mid;
        else l=mid+1;
        for (auto i:all[mid])
            qry[fa[i]]=0;
    }
    l--;
    int p=l;
    l=0,r=all[p].size();
    while (l<r){
        int mid=(l+r)>>1;
        for (int j=l;j<=mid;j++)
            qry[fa[all[p][j]]]=1;
        int dis=ask(qry);
        for (int j=l;j<=mid;j++)
            qry[fa[all[p][j]]]=0;
        if (dis!=mn) r=mid;
        else l=mid+1;
    }
    return all[p][l];
}
void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
    n=N; m=U.size();
    for (int i=0;i<m;i++){
        g[U[i]].push_back({V[i],i});
        g[V[i]].push_back({U[i],i});
    }
    qry.resize(m,0);
    mn=ask(qry);
    int s=solve1(0),d=mn/A;
    bfs(s);
    int p=d+1;
    int l=0,r=all[p].size();
    while (l<r){
        int mid=(l+r)>>1;
        for (int j=l;j<=mid;j++)
            qry[fa[all[p][j]]]=1;
        int dis=ask(qry);
        for (int j=l;j<=mid;j++)
            qry[fa[all[p][j]]]=0;
        if (dis!=mn) r=mid;
        else l=mid+1;
    }
    int t=all[p][l];
    answer(s,t);
}
/*
6 5 2 3 1 5
0 1
1 2
2 4
0 3
3 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...