제출 #1068178

#제출 시각아이디문제언어결과실행 시간메모리
1068178Muhammad_Aneeq통행료 (IOI18_highway)C++17
18 / 100
109 ms36960 KiB
#include <vector> #include <iostream> #include <map> #include "highway.h" using namespace std; int const MAXN=1e5; vector<int>w; long long dis=0; vector<pair<int,int>>nei[MAXN]={}; int B1,A1; vector<pair<int,int>>edges; vector<int>ed[MAXN]={}; int h[MAXN]={}; int p[MAXN]={}; vector<int>d; vector<int>g; int it[MAXN],ot[MAXN]; int tm=0; void dfs(int u,int pa=-1) { it[u]=tm++; p[u]=pa; for (auto [i,in]:nei[u]) { if (i==pa) continue; ed[h[u]].push_back(in); h[i]=h[u]+1; dfs(i,u); } ot[u]=tm-1; } bool check(int mid) { for (int i=mid;i<MAXN;i++) { for (auto j:ed[i]) w[j]=1; } long long g=ask(w); for (int i=mid;i<MAXN;i++) { for (auto j:ed[i]) w[j]=0; } return (g!=dis); } bool check1(int mid,int z) { for (int i=mid;i<MAXN;i++) { for (auto j:ed[i]) { int x=edges[j].first; if (it[x]<=it[z]&&ot[x]>=ot[z]) continue; w[j]=1; } } long long g=ask(w); for (int i=mid;i<MAXN;i++) { for (auto j:ed[i]) w[j]=0; } return (g!=dis); } void divi(int st,int en) { if (st==en) { d.push_back(g[en]); return; } int mid=(st+en)/2; for (int i=st;i<=mid;i++) w[g[i]]=1; long long co=ask(w); for (int i=st;i<=mid;i++) w[g[i]]=0; if (co>dis) divi(st,mid); for (int i=mid+1;i<=en;i++) w[g[i]]=1; co=ask(w); for (int i=mid+1;i<=en;i++) w[g[i]]=0; if (co>dis) divi(mid+1,en); } void find_pair(int N, vector<int> U, vector<int> V, int A, int B) { A1=A,B1=B; int m=U.size(); for (int i=0;i<m;i++) { nei[U[i]].push_back({V[i],i}); nei[V[i]].push_back({U[i],i}); } dfs(0); for (int i=0;i<m;i++) { if (h[U[i]]>h[V[i]]) swap(U[i],V[i]); edges.push_back({U[i],V[i]}); } w.resize(m,0); dis=ask(w); h[0]=0; int st=0,en=N; while (st+1<en) { int mid=(st+en)/2; if (check(mid)) st=mid; else en=mid; } for (auto i:ed[st]) g.push_back(i); divi(0,g.size()-1); if (d.size()==2) answer(edges[d[0]].second,edges[d[1]].second); else { en=st; st=-1; int z=edges[d[0]].second; while (st+1<en) { int mid=(st+en)/2; if (check1(mid,z)) st=mid; else en=mid; } if (st==-1) { int len=dis/A; int x=z; while (len--) x=p[x]; answer(z,x); return; } d={}; for (auto i:ed[st]) { int x=edges[i].first; if (it[x]<=it[z]&&ot[x]>=ot[z]) continue; g.push_back(i); } divi(0,g.size()-1); answer(z,edges[d[0]].second); } }
#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...