Submission #776325

#TimeUsernameProblemLanguageResultExecution timeMemory
776325I_Love_EliskaM_Highway Tolls (IOI18_highway)C++14
51 / 100
140 ms15512 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0;i<n;++i) #define ll long long #define pb push_back #define all(x) x.begin(), x.end() const ll inf = 1e18; #define pi pair<int,int> #define f first #define s second const int maxn=1e5; vector<pi> adj[maxn]; pi e[maxn]; vector<int> z; void dfs(int u, int p) { for(auto&ed:adj[u]) { int v=ed.f, i=ed.s; if (v==p) continue; e[i]={u,v}; z.pb(i); dfs(v,u); } } mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); void find(int n, vector<int>u, vector<int>v, int a, int b) { if (a!=1 || b!=2) exit(0); int m=u.size(); vector<int> f,s; ll x; forn(it,18) { f.clear(), s.clear(); vector<int> ok(n); forn(i,n) ok[i]=rng()&1; forn(i,n) (ok[i]?f:s).pb(i); if (min(f.size(),s.size())==0) { --it; continue; } vector<int> q(m,0); forn(i,m) q[i]=ok[u[i]]==ok[v[i]]; x = ask(q); if (x&1) { break; } } if (!(x&1)) exit(0); if (f.size()>s.size()); int l=0, r=f.size()-1; while (l<r) { int mid=(l+r)>>1; vector<int> ok(n); for(auto&x:s) ok[x]=1; forn(i,mid+1) ok[f[i]]=1; vector<int> q(m,0); forn(i,m) q[i]=ok[u[i]]==ok[v[i]]; x = ask(q); if (x&1) l=mid+1; else r=mid; } int st = f[r]; vector<vector<pi>> g(n); forn(i,m) { g[u[i]].pb({v[i],i}); g[v[i]].pb({u[i],i}); } vector<int> p(n); vector<int> vis(n); vis[st]=1; queue<int> q; q.push(st); while (q.size()) { auto u=q.front();q.pop(); for(auto&ed:g[u]) { int v=ed.f, i=ed.s; if (vis[v]) continue; vis[v]=1; p[v]=i; e[i]={u,v}; q.push(v); adj[u].pb({v,i}); } } z.clear(); dfs(st,-1); l=0, r=n-2; ll S=ask(vector<int>(m,1)); while (l<r) { int mid=(l+r)>>1; vector<int> q(m); forn(i,mid+1) q[z[i]]=1; ll x=ask(q); if (x==S) r=mid; else l=mid+1; } answer(st,e[z[r]].s); } void find_pair(int n, vector<int>u, vector<int>v, int a, int b) { int m=u.size(); if (m!=n-1) { find(n,u,v,a,b); return; } forn(i,n-1) adj[u[i]].pb({v[i],i}), adj[v[i]].pb({u[i],i}); int k=0; forn(i,n) if (adj[i].size()==1) k=i; dfs(k,-1); ll s = ask(vector<int>(m,1)); int l=0, r=n-2; while (l<r) { int m=(l+r)>>1; vector<int> q(n-1); forn(i,m+1) q[z[i]]=1; ll x=ask(q); if (x==s) r=m; else l=m+1; } k = e[z[r]].s; //k=0; z.clear(); dfs(k,-1); l=0, r=n-2; while (l<r) { int m=(l+r)>>1; vector<int> q(n-1); forn(i,m+1) q[z[i]]=1; ll x=ask(q); if (x==s) r=m; else l=m+1; } answer(k,e[z[r]].s); }
#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...