제출 #587232

#제출 시각아이디문제언어결과실행 시간메모리
587232jasminHighway Tolls (IOI18_highway)C++14
0 / 100
16 ms1768 KiB
#include<bits/stdc++.h>
using namespace std;
#include<highway.h>

const int inf=1e9+7;

/*int64_t ask(vector<int> w){
    return 0;
}
void answer(int a, int b){

}*/

int find_edge(int m, int64_t dist){
    vector<int> w(m, 0);

    int l=0; int r=m-1;
    int ans=m-1;
    while(l<=r){
        int mi=l+(r-l)/2;
        w.assign(m, 0);
        for(int i=0; i<=mi; i++){
            w[i]=1;
        }
        int64_t resp=ask(w);
        if(resp!=dist){
            ans=mi;
            r=mi-1;
        }
        else{
            l=mi+1;
        }
    }
    return ans;
}

void dfs(int v, int d, vector<vector<int> >& adi, vector<bool>& vis, vector<int>& cand, int dist){
    if(vis[v]) return;
    vis[v]=true;

    if(d==dist){
        cand.push_back(v);
    }

    for(auto u: adi[v]){
        dfs(u, d+1, adi, vis, cand, dist);
    }
}

int find_node(vector<int>& cand, vector<vector<int> >& con, int m, int dist){
    vector<int> w(m, 0);
    int l=0; int r=cand.size()-1;
    int ans=r;
    while(l<=r){
        int mi=l+(r-l)/2;
        w.assign(m, 0);
        for(int i=0; i<=mi; i++){
            for(auto x: con[i]){
                w[x]=1;
            }
        }
        int resp=ask(w);
        if(resp!=dist){
            ans=mi;
            r=mi-1;
        }
        else{
            l=mi+1;
        }
    }
    return ans;
}

void find_pair(int n, vector<int> u, vector<int> v, int A, int B){
    int m=u.size();
    vector<int> w(m, 0);
    vector<int> cand;
    int64_t dist=ask(w); 
    int length=dist/(int64_t)A;

    int x=find_edge(m, dist);
    vector<bool> vis(n);
    vector<vector<int> > adi(n);
    vector<vector<int> > con(n);
    for(int i=0; i<m; i++){
        if(i==x) continue;
        adi[v[i]].push_back(u[i]);
        adi[u[i]].push_back(v[i]);

        con[v[i]].push_back(i);
        con[u[i]].push_back(i);
    }
    con[v[x]].push_back(x);
    con[u[x]].push_back(x);

    dfs(u[x], 0, adi, vis, cand, inf);
    w.assign(n, 0);
    for(int i=0; i<n; i++){
        if(!vis[i]) continue;

        for(auto j: con[i]){
            w[j]=1;
        }
    }
    int length1=(ask(w)-dist)/(B-A);
    int64_t dist1=length1*A;
    int length2=length-1-length1;
    int64_t dist2=length2*A;

    vis.assign(n, false);
    cand.assign(0, 0);
    dfs(u[x], 0, adi, vis, cand, length1);
    int a=find_node(cand, con, m, dist);

    vis.assign(n, false);
    cand.assign(0, 0);
    dfs(v[x], 0, adi, vis, cand, length2);
    int b=find_node(cand, con, m, dist);
    
    answer(a, b);
}

/*signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);


}*/

컴파일 시 표준 에러 (stderr) 메시지

highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:106:13: warning: unused variable 'dist1' [-Wunused-variable]
  106 |     int64_t dist1=length1*A;
      |             ^~~~~
highway.cpp:108:13: warning: unused variable 'dist2' [-Wunused-variable]
  108 |     int64_t dist2=length2*A;
      |             ^~~~~
#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...