제출 #1005846

#제출 시각아이디문제언어결과실행 시간메모리
1005846irmuun통행료 (IOI18_highway)C++17
12 / 100
260 ms262144 KiB
#include<bits/stdc++.h> #include "highway.h" using namespace std; #define ll long long #define pb push_back #define ff first #define ss second #define all(s) s.begin(),s.end() #define rall(s) s.rbegin(),s.rend() const int maxn=9e4+5; int n,m,a,b; vector<int>u,v; vector<pair<int,int>>adj[maxn]; vector<int>par(maxn,0),dep(maxn,0),edge(maxn,0),w; vector<bool>used(maxn); void dfs(int x,int p){ par[x]=p; for(auto [y,e]:adj[x]){ if(y!=p){ dep[y]=dep[x]+1; edge[y]=e; dfs(y,x); } } } void find_pair(int N,vector<int>U,vector<int>V,int A, int B){ n=N,u=U,v=V,a=A,b=B; m=u.size(); w.resize(m); fill(all(w),0); for(int i=0;i<m;i++){ adj[u[i]].pb({v[i],i}); adj[v[i]].pb({u[i],i}); } ll C=ask(w); dep[0]=0; dfs(0,-1); vector<int>ver; for(int i=1;i<n;i++){ if((ll)dep[i]*(ll)a==C){ ver.pb(i); } } int l=0,r=ver.size()-1; while(l<r){ int mid=(l+r)/2; fill(all(w),0); for(int i=0;i<=mid;i++){ w[edge[ver[i]]]=1; } ll cost=ask(w); if(cost>C){ r=mid; } else{ l=mid+1; } } answer(0,ver[l]); return; }
#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...