Submission #597140

#TimeUsernameProblemLanguageResultExecution timeMemory
597140yutabiHighway Tolls (IOI18_highway)C++14
6 / 100
120 ms8488 KiB
#include "highway.h"


#include <bits/stdc++.h>
using namespace std;


#define pb push_back


typedef long long ll;
typedef pair <int,int> ii;


vector <int> remap_edge;
vector <int> remap_node;



ll my_ask(vector <int> vals)
{
    vector <int> nw_vals(vals.size());

    for(int i=0;i<vals.size();i++)
    {
        nw_vals[remap_edge[i]]=vals[i];
    }

    return ask(nw_vals);
}


void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B)
{
    ll a=A;

    vector <vector <ii> > c(N);

    remap_node=vector <int> (N);
    remap_edge=vector <int> (N);

    for(int i=0;i<U.size();i++)
    {
        c[U[i]].pb(ii(V[i],i));
        c[V[i]].pb(ii(U[i],i));
    }

    int start;

    for(int i=0;i<N;i++)
    {
        if(c[i].size()==1)
        {
            start=i;
        }
    }

    vector <bool> v(N,0);


    int curr=start;

    for(int i=0;i<N;i++)
    {
        v[curr]=1;
        remap_node[i]=curr;

        if(i+1!=N)
        {
            for(int j=0;j<c[curr].size();j++)
            {
                if(v[c[curr][j].first]==0)
                {
                    int nw=c[curr][j].first;
                    int edge=c[curr][j].second;

                    remap_edge[i]=edge;

                    curr=nw;

                    break;
                }
            }
        }
    }

    /*for(int i=0;i<N;i++)
    {
        printf("%d ",remap_node[i]);
    }

    printf("\n");

    for(int i=0;i<N-1;i++)
    {
        printf("%d ",remap_edge[i]);
    }

    printf("\n");*/

    vector <int> query(N-1,0);

    ll low=my_ask(query);
    ll dist=low/a;

    int l=0;
    int r=N-2;
    int m=(l+r)/2;

    while(l!=r)
    {
        for(int i=0;i<=m;i++)
        {
            query[i]=1;
        }

        for(int i=m+1;i<N-1;i++)
        {
            query[i]=0;
        }

        ll res=my_ask(query);

        if(res>low)
        {
            r=m;
        }

        else
        {
            l=m+1;
        }

        m=(l+r)/2;
    }

    //printf("\n%d %d %d %d %d %d\n\n",l,m,r,dist,remap_node[l],remap_node[l+dist]);

    answer(remap_node[l], remap_node[l+dist]);
}

Compilation message (stderr)

highway.cpp: In function 'll my_ask(std::vector<int>)':
highway.cpp:24:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |     for(int i=0;i<vals.size();i++)
      |                 ~^~~~~~~~~~~~
highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:42:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   42 |     for(int i=0;i<U.size();i++)
      |                 ~^~~~~~~~~
highway.cpp:70:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |             for(int j=0;j<c[curr].size();j++)
      |                         ~^~~~~~~~~~~~~~~
#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...