Submission #1078073

#TimeUsernameProblemLanguageResultExecution timeMemory
1078073woodHighway Tolls (IOI18_highway)C++17
5 / 100
91 ms16588 KiB
#include "highway.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> p32; typedef pair<ll,ll> p64; #define pb push_back #define eb emplace_back #define fi first #define se second #define vi vector<int> #define vp32 vector<p32> #define fast_cin() ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL) #define MOD %1000000007 #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; //never guess //never debug without reviewing code //never try adding ones or substracting them //only step by step debug when necessay int getstart(int u, int v, vp32 adj[], int n, int depth, ll cost){ int d[n]; memset(d,0,sizeof d); d[v] = INT_MAX; d[u] = 1; queue<int> q; q.push(u); int edge[n]; while(!q.empty()){ int x = q.front(); q.pop(); for(p32 ii : adj[x]){ if(!d[ii.fi]){ d[ii.fi] = d[x]+1; q.push(ii.fi); edge[ii.fi] = ii.se; } } } vi possible; for(int i = 0; i<n; i++){ if(d[i]==depth+1) possible.pb(i); } int l = -1, r = possible.size()-1; while(r-l>1){ int m = (r+l)/2; vi w(n-1); for(int i = l+1; i<=m; i++) w[edge[possible[i]]] = 1; if(ask(w)>cost) r = m; else l = m; } return possible[r]; } int setsubtree(int u, int v, vp32 adj[], int n){ bool done[n]; memset(done,0,sizeof done); done[v] = true; stack<int> st; st.push(u); vi w(n-1); while(!st.empty()){ int x = st.top(); st.pop(); done[x] = true; for(auto ii : adj[x]){ if(!done[ii.fi]){ w[ii.se] = 1; st.push(ii.fi); } } } return ask(w); } void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) { int m = U.size(),n = N; vp32 adj[n]; for(int i = 0; i<m; i++){ adj[U[i]].eb(V[i],i); adj[V[i]].eb(U[i],i); } int l = -1, r = n; ll cost = ask(vi(m)); while(r-l>1){ int mid = (r + l) / 2; vi w(m); for(int i = l+1; i <= mid; i++)w[i] = 1; if(ask(w)==cost) l = mid; else r = mid; } int ulength = (setsubtree(U[r],V[r],adj,n)-cost)/(B-A); int vlength = cost/A-ulength-1; answer(getstart(U[r],V[r],adj,n,ulength,cost),getstart(V[r],U[r],adj,n,vlength,cost)); }
#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...