Submission #416164

#TimeUsernameProblemLanguageResultExecution timeMemory
4161642fat2codeHighway Tolls (IOI18_highway)C++17
100 / 100
260 ms12964 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define fr first
#define sc second
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)

const int nmax = 90005;
const int mmax = 130005;

long long len_edges, a, b;
int N, M, goodedge;

vector<pair<int,int>>nod[nmax];

int find_lenght(int A, int B){
    vector<int>w;
    for(int i=0;i<M;i++) w.push_back(0);
    long long lmao = ask(w);
    return lmao / A;
}

int find_index(){
    int l = 0, r = M - 1, ok = 0;
    while(l <= r){
        int mid = l + (r - l) / 2;
        vector<int>w;
        for(int i=0;i<mid;i++) w.push_back(0);
        for(int i=mid;i<M;i++) w.push_back(1);
        long long lmao = ask(w);
        if(lmao > len_edges * a){
            ok = mid;
            l = mid + 1;
        }
        else{
            r = mid - 1;
        }
    }
    return ok;
}

vector<int> bfs(int vertex1, int vertex2, vector<int>U, vector<int>V){
    int marked[M], marked2[M];
    for(int i=0;i<M;i++) marked2[i] = 0;
    queue<int>Q;
    vector<int>interesting_egdes1, interesting_egdes2;
    int marked_v[N], viz[N], par[N];
    for(int i=0;i<N;i++){
        marked_v[i] = 0;
        viz[i] = 0;
        par[i] = 0;
    }
    par[vertex1] = -1;
    Q.push(vertex1);
    viz[vertex1] = 1;
    Q.push(vertex2);
    viz[vertex2] = 1;
    marked2[goodedge] = 1;
    marked_v[vertex2] = 1;
    while(Q.size()){
        int x = Q.front();
        Q.pop();
        for(auto it : nod[x]){
            if(!viz[it.fr]){
                if(marked_v[x] == 0){
                    interesting_egdes1.push_back(it.sc);
                }
                if(marked_v[x] == 1){
                    interesting_egdes2.push_back(it.sc);
                    marked_v[it.fr] = 1;
                }
                marked2[it.sc] = 1;
                par[it.fr] = x;
                viz[it.fr] = 1;
                Q.push(it.fr);
            }
        }
    }
    int ok = vertex2;
    int l = 0, r = (int)interesting_egdes2.size() - 1;
    reverse(all(interesting_egdes2));
    while(l <= r){
        int last = 0;
        int mid = l + (r - l) / 2;
        vector<int>w(M);
        for(int i=0;i<M;i++){
            if(!marked2[i]) w[i] = 1;
        }
        for(int i=0;i<=mid;i++){
            w[interesting_egdes2[i]] = 1;
        }
        last = interesting_egdes2[mid];
        if(par[U[last]] == V[last]){
            last = U[last];
        }
        else{
            last = V[last];
        }
        long long pls = ask(w);
        if(pls != len_edges * a){
            ok = last;
            r = mid - 1;
        }
        else{
            l = mid + 1;
        }
    }
    vector<int>rs;
    rs.push_back(ok);
    ok = vertex1;
    l = 0, r = (int)interesting_egdes1.size() - 1;
    reverse(all(interesting_egdes1));
    while(l <= r){
        int last = 0;
        int mid = l + (r - l) / 2;
        vector<int>w(M);
        for(int i=0;i<M;i++){
            if(!marked2[i]) w[i] = 1;
        }
        for(int i=0;i<=mid;i++){
            w[interesting_egdes1[i]] = 1;
        }
        last = interesting_egdes1[mid];
        if(par[U[last]] == V[last]){
            last = U[last];
        }
        else{
            last = V[last];
        }
        long long pls = ask(w);
        if(pls != len_edges * a){
            ok = last;
            r = mid - 1;
        }
        else{
            l = mid + 1;
        }
    }
    rs.push_back(ok);
    return rs;
}

void find_pair(int n, vector<int> U, vector<int> V, int A, int B) {
    M = (int)U.size();
    N = n;
    a = A, b = B;
    for(int i=0;i<M;i++){
        nod[U[i]].push_back({V[i], i});
        nod[V[i]].push_back({U[i], i});
    }
    len_edges = find_lenght(A, B);
    int indx = find_index();
    goodedge = indx;
    int vertex1 = U[indx];
    int vertex2 = V[indx];
    vector<int>ans = bfs(vertex1, vertex2, U, V);
    answer(ans[0], ans[1]);
}

Compilation message (stderr)

highway.cpp: In function 'std::vector<int> bfs(int, int, std::vector<int>, std::vector<int>)':
highway.cpp:49:9: warning: unused variable 'marked' [-Wunused-variable]
   49 |     int marked[M], marked2[M];
      |         ^~~~~~
#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...