답안 #825921

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
825921 2023-08-15T09:22:15 Z ALeonidou 통행료 (IOI18_highway) C++17
컴파일 오류
0 ms 0 KB
#include <bits/stdc++.h>
#include "highway.h"
 
using namespace std;
 
#define ll int
typedef vector <ll> vi;
typedef pair <ll,ll > ii;
typedef vector <ii> vii;
#define sz(x) (ll)x.size()
#define pb push_back
#define F first
#define S second
#define MID ((l+r)/2)
#define dbg(x) cout<<#x<<": "<<x<<endl;
#define dbg2(x,y) cout<<#x<<": "<<x<<" "<<#y<<": "<<y<<endl;
#define dbg3(x,y,z) cout<<#x<<": "<<x<<" "<<#y<<": "<<y<<" "<<#z<<": "<<z<<endl;
 
void tabb(ll n){
    for (ll i= 0; i<n; i++) cout<<"\t";
}
 
void printVct(vi &v){
    for (ll i=0; i<sz(v); i++){
        cout<<v[i]<<" ";
    }
    cout<<endl;
}
 
void printVctPair(vii &v){
    for (ll i=0; i<sz(v); i++){
        cout<<"("<<v[i].F<<","<<v[i].S<<") ";
    }
    cout<<endl;
}
 
void printVct2D(vector<vi> &adj){
    for (ll i=0; i<sz(adj); i++){
        cout<<i<<": ";
        for (ll j =0; j<sz(adj[i]); j++){
            cout<<"("<<adj[i][j]<<"),";
        }
        cout<<endl;
    }
    cout<<endl;
}
 
void printVctPair2D(vector<vii> &adj){
    for (ll i=0; i<sz(adj); i++){
        for (ll j =0; j<sz(adj[i]); j++){
            cout<<"("<<adj[i][j].F<<","<<adj[i][j].S<<"),";
        }
        cout<<endl;
    }
    cout<<endl;
}
 
vector <vii> adj;
ll n,m;
long long b;   //all light case value

ll calls= 1;
 
void find_pair(int N, vi V, vi U, int A,int B) {
    n = N; m = sz(U);
    adj.assign(n, vii());
    for (ll i=0; i<m ;i++){
        adj[U[i]].pb(ii(V[i], i));
        adj[V[i]].pb(ii(U[i], i));
    }
    vi v(m, 0);  
    b = ask(v);
 
    ll l, r, mid;
 
    //STEP 1 - Find node on path from S to T
    l = 0, r = m-1;
    while (l < r){
        mid = MID;
        v.assign(m, 0);
        for (ll i = 0; i<=mid; i++) 
            v[i] = 1;
 
      	if (calls == 60){
        	cout<<"hello";
          	return -1;
        }	
      	calls++;
        long long c = ask(v);
        if (c > b) r = mid;
        else l = mid+1;
    }
    ll p = U[l];
 
    //STEP 2 - Find distance from S
    vi disNode(n);
    vector <vi> dis(n, vi());
    ll h = 0;
    queue <ii> q;
    vi vis(n, 0);
    q.push(ii(p,0));
    while (!q.empty()){
        ii f = q.front();
        q.pop();
        
        ll u = f.F;
        ll level = f.S;
 
        h = max(level, h);
        disNode[u] = level;
 
        vis[u] = 1;
        for (ll i= 0; i<sz(adj[u]); i++){
            if (!vis[adj[u][i].F]){
                q.push(ii(adj[u][i].F,level+1));
                dis[level+1].pb(adj[u][i].S);
            }
        }
    }
    //printVct2D(dis);
    l = 1, r = h;
    ll maxDis = 0;
    while (l <= r){
        mid = MID;
        v.assign(m,0);
        for (ll i =0; i<sz(dis[mid]); i++) 
            v[dis[mid][i]] =1;
 	
      	if (calls == 60){
        	cout<<"hello";
          	return -1;
        }	
      	calls++;
        long long c = ask(v);
        if (c > b){
            l = mid + 1;
            maxDis = mid;
        }
        else{
            r = mid - 1;
        }
    }
 
    //STEP 3 - Find S
    l = 0, r = sz(dis[maxDis]) -1;
    while (l < r){
        mid = MID;
        v.assign(m, 0);
        for (ll i=0; i<=mid; i++)
            v[dis[maxDis][i]] = 1;
 
      	if (calls == 60){
        	cout<<"hello";
          	return -1;
        }	
      	calls++;
        long long c = ask(v);
        if (c > b) r = mid;
        else l = mid + 1;
    }
    ll e2 = dis[maxDis][l],s;
    if (disNode[U[e2]] > disNode[V[e2]]) s = U[e2];
    else s = V[e2];
 
    //STEP 4 - Find T
    vi canditates;
    ll st = b / A;
    q.push(ii(s, 0));
    vis.assign(n ,0);
    while (!q.empty()){
        ii f = q.front();
        q.pop();
        ll u = f.F;
        ll level = f.S;
        vis[u] =1 ;
        disNode[u] = level;
        for(ll i =0; i<sz(adj[u]); i++){
            if (!vis[adj[u][i].F]){
                q.push(ii(adj[u][i].F, level +1));
                if (level + 1 == st){
                    canditates.pb(adj[u][i].S);
                }
            }
        }
    }
    //printVct(canditates);
    l = 0, r = sz(canditates)-1;
    while (l < r){
        mid = MID;
        v.assign(m , 0);
        for (ll i = 0; i<= mid; i++)
            v[canditates[i]] = 1;
 
      	if (calls == 60){
        	cout<<"hello";
          	return -1;
        }	
      	calls++;
        long long c = ask(v);
        if (c > b) r = mid;
        else l = mid+1;
    }
    ll e3 = canditates[l],t;
    if (disNode[U[e3]] > disNode[V[e3]]) t = U[e3];
    else t = V[e3];
    //dbg2(e3, t);
 
    //dbg2(s, t);
    answer(s, t);
}
 
/*
14 13 2 5 3 10
0 1
1 5
1 2
2 3
1 4
5 7
7 8
5 6
3 12
3 11
2 9
9 10
9 13
 
*/

Compilation message

highway.cpp: In function 'void find_pair(int, vi, vi, int, int)':
highway.cpp:86:19: error: return-statement with a value, in function returning 'void' [-fpermissive]
   86 |            return -1;
      |                   ^~
highway.cpp:131:19: error: return-statement with a value, in function returning 'void' [-fpermissive]
  131 |            return -1;
      |                   ^~
highway.cpp:154:19: error: return-statement with a value, in function returning 'void' [-fpermissive]
  154 |            return -1;
      |                   ^~
highway.cpp:196:19: error: return-statement with a value, in function returning 'void' [-fpermissive]
  196 |            return -1;
      |                   ^~