Submission #595376

#TimeUsernameProblemLanguageResultExecution timeMemory
595376TimDeeHighway Tolls (IOI18_highway)C++14
11 / 100
236 ms13008 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
void find_pair(int n,vector<int>u,vector<int>v,int a,int b) {
    int m=u.size();                 int CNT=0;
    vector<int>scuza(m,1),amog,paiu;
    int dist=ask(scuza)/b;
    vector<int>d(n,0);
    vector<int>vis(n,0);
    vector<vector<pair<int,int>>>adj(n);
    for(int i=0;i<m;++i){
        adj[u[i]].push_back({v[i],i});
        adj[v[i]].push_back({u[i],i});
    }
    vis[0]=1;
    queue<int>q; q.push(0);
    while (!q.empty()) {
        int u=q.front(); q.pop();
        for(auto it:adj[u]) {
            int v=it.first;
            if (!vis[v]) {
                vis[v]=1; d[v]=d[u]+1; q.push(v);
            }
        }
    }
    vector<vector<int>>D(n); for(int i=0;i<n;++i) D[d[i]].push_back(i);
    int l=0,r=n-1; while(l<r) {
        int mid=(l+r)>>1; ++CNT; if (CNT>=60) exit(1);
        paiu=scuza;
        for (int i=0;i<=mid;++i) for(auto u:D[i]) for(auto it:adj[u]) if(d[it.first]==d[u]-1) paiu[it.second]=0;
        int x=ask(paiu); if(x<dist*b) r=mid; else l=mid+1;
    } int s; if (r==0) s=0; else {
    amog=D[r]; int bgn;
    l=0,r=amog.size()-1; while(l<r) {
        int mid=(l+r)>>1; ++CNT; if (CNT>=60) exit(1);
        paiu=scuza;
        for(int i=l;i<=mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0;
        int x=ask(paiu); if(x<dist*b) r=mid; else l=mid+1;
    } bgn=amog[r]; 
    vis.assign(n,0);
    for(auto it:adj[bgn]) if(d[it.first]+1==d[bgn]) vis[it.first]=1;
    vis[bgn]=1; q.push(bgn);
    d.assign(n,1e9); for(int i=0;i<n;++i) if(vis[i]) d[i]=-1; d[bgn]=0;
    while (!q.empty()) {
        int u=q.front(); q.pop();
        for(auto it:adj[u]) {
            int v=it.first;
            if(!vis[v]) {vis[v]=1; d[v]=d[u]+1; q.push(v);}
        }
    }
    D.assign(n,vector<int>(0));
    for(int i=0;i<n;++i) if(d[i]>=0 && d[i]!=1e9)D[d[i]].push_back(i);
    l=0,r=n-1;
    while (l<r) {
        int mid=(l+r)>>1; ++CNT; if (CNT>=60) exit(1);
        paiu=scuza;
        for(auto u:D[mid]) for(auto it:adj[u]) if(d[it.first]==d[u]+1) paiu[it.second]=0;
        int x=ask(paiu);if(x<b*dist) l=mid+1; else r=mid;
    }
    amog=D[r]; l=0,r=amog.size()-1;
    while(l<r) {
        int mid=(l+r)>>1; ++CNT; if (CNT>=60) exit(1);
        paiu=scuza;
        for(int i=l;i<=mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0;
        int x=ask(paiu); if(x<b*dist) r=mid; else l=mid+1;
    }
    s=amog[r]; } 
    d.assign(n,0); vis.assign(n,0); vis[s]=1; 
    q.push(s);
    while (!q.empty()) {
        int u=q.front(); q.pop();
        for (auto it:adj[u]) {
            int v=it.first; if(!vis[v]) {vis[v]=1; d[v]=d[u]+1; q.push(v);}
        }
    }
    D.assign(n,vector<int>(0));
    for(int i=0;i<n;++i) D[d[i]].push_back(i);
    amog=D[dist]; l=0,r=amog.size()-1;
    while(l<r) {
        int mid=(l+r)>>1; ++CNT; if (CNT>=60) exit(1);
        paiu=scuza;
        for(int i=l;i<=mid;++i) for(auto it:adj[amog[i]]) if(d[it.first]==d[amog[i]]-1) paiu[it.second]=0;
        int x=ask(paiu); if(x<b*dist) r=mid; else l=mid+1;
    }
    int t=amog[r];
    answer(s,t);
}
#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...