제출 #425373

#제출 시각아이디문제언어결과실행 시간메모리
425373arneves통행료 (IOI18_highway)C++17
51 / 100
269 ms14160 KiB
#include "highway.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define f first
#define s second

vector<pair<int,int>> adj[150000];
int ver[150000];
int are[150000];
int visitados[150000];
int contador;

void dfs(int s){

    for(auto u: adj[s]){
        if(visitados[u.f]==0){
            visitados[u.f]++;
            are[u.s]=contador;
            ver[contador]=u.f;
            contador++;
            dfs(u.f);
        }
    }
}
void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {


    int M=U.size();
    if(M==N-1||1){
        vector<int> w(M,0);

        ll tamanho=ask(w);

        for(int i=0; i<M; i++){

            adj[U[i]].push_back({V[i],i});
            adj[V[i]].push_back({U[i],i});
        }

        int l=0, r=N-2, m;

        while(l<r){

            m=(l+r)/2;

            for(int i=0; i<M; i++){
                if(i<=m) w[i]=1;
                else w[i]=0;
            }

            if(ask(w)!=tamanho){
                r=m;
            }else{
                l=m+1;
            }
        }

//partimos o gráfico pela aresta l, logo os
//vertices das duas arvores que sobram serao
//os extremos da aresta l;
        int a=U[l], b=V[l];

        memset(visitados, 0, sizeof(visitados));
        memset(ver,-1, sizeof(ver));
        memset(are,-1,sizeof(are));

        visitados[b]=visitados[a]=1;
        contador=0;
        dfs(a);

        int ans1, ans2;

        l=-1;
        r=N-2;
        while(l<r){

            m=(l+r+1)/2;

            for(int i=0; i<M; i++){
                if(are[i]>=m) w[i]=1;
                else w[i]=0;
                //cout<<w[i]<<' ';
            }
            //cout<<'\n';
            if(ask(w)!=tamanho){
                l=m;
            }else{
                r=m-1;
            }
        }
        ans1=l;
        if(ans1==-1) ans1=a;
        else ans1= ver[ans1];

        memset(visitados, 0, sizeof(visitados));
        memset(ver,-1, sizeof(ver));
        memset(are,-1,sizeof(are));

        visitados[b]=visitados[a]=1;
        contador=0;
        dfs(b);

        l=-1;
        r=N-2;
        while(l<r){

            m=(l+r+1)/2;

            for(int i=0; i<M; i++){
                if(are[i]>=m) w[i]=1;
                else w[i]=0;
                //cout<<w[i]<<' ';
            }
            //cout<<'\n';
            if(ask(w)!=tamanho){
                l=m;
            }else{
                r=m-1;
            }
        }
        ans2=l;
        if(ans2==-1) ans2=b;
        else ans2= ver[ans2];

        //for(int i=0; i<M; i++) cout<<are[i]<<' '; cout<<'\n';
        //for(int i=0; i<M; i++) cout<<ver[i]<<' '; cout<<'\n';
        //for(auto u: are) cout<<u<<' '; cout<<'\n';
        answer(ans1, ans2);
        //cout<<"->"<<ans1<<' '<<ans2<<'\n';
    }else{

    }
}
/*
5 4 16 20 1 4
0 1
1 2
2 3
3 4
****************
5 4 16 20 1 3
0 1
1 2
2 3
3 4
****************
5 4 16 20 0 2
0 1
1 2
2 3
3 4
****************
5 4 16 20 3 4
0 1
1 2
2 3
3 4
*/
/*
void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {

    int M=U.size();

    ll tamanho;

    vector<int> w(M,0);

    ll ultima=ask(w), atual;

    tamanho=(ultima/A);
    w[0]=1;

    int l=0, r=N-2, m;

    while(l<r){
        m=(l+r)/2;

        for(int i=0; i<M; i++){
            if(i<=m){
                w[i]=0;
            }else{
                w[i]=1;
            }
            //cout<<w[i]<<' ';
        }
        //cout<<"->"<<m<<'\n';
        atual=ask(w);

        if(atual==ultima){
            r=m-1;
        }else if(atual/B==ultima/A){
            l=m+1;
        }else{
            r=m;
        }
    }

    //cout<<l<<' '<<l+tamanho<<'\n';
    answer(l, l+tamanho);
}
*/
#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...