Submission #935676

#TimeUsernameProblemLanguageResultExecution timeMemory
935676GrindMachine철로 (IOI14_rail)C++17
30 / 100
216 ms99036 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) (int)a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x,y) ((x+y-1)/(y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a,b); } template<typename T> void amax(T &a, T b) { a = max(a,b); } #ifdef LOCAL #include "debug.h" #else #define debug(x) 42 #endif /* */ const int MOD = 1e9 + 7; const int N = 5e3 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; #include "rail.h" int dp[N][N]; int query(int i, int j){ if(i == j) return 0; if(dp[i][j] != -1){ return dp[i][j]; } return dp[i][j] = getDistance(i,j); } void findLocation(int n, int first, int location[], int stype[]) { rep(i,n){ location[i] = -1; stype[i] = -1; } memset(dp,-1,sizeof dp); location[0] = first; stype[0] = 1; if(n == 1) return; // find the guys to the right set<pii> st; rep1(i,n-1){ st.insert({query(0,i),i}); } int first_right = st.begin()->second; while(!st.empty()){ auto [dis,i] = *st.begin(); st.erase(st.begin()); // left if(i != first_right){ if(query(0,first_right)+query(first_right,i) == query(0,i)){ conts; } } location[i] = first+dis; stype[i] = 2; // right vector<pll> torem; for(auto [dis2,j] : st){ // does j lie in between a[0] and i? (j is type C) if(query(0,i)+query(i,j) == query(0,j)){ // cout << i << " " << j << endl; torem.pb({dis2,j}); location[j] = query(0,i)-query(i,j); stype[j] = 1; } } trav(p,torem){ st.erase(p); } } // find the guys to the left rep(i,n){ if(location[i] < first){ st.insert({query(0,i)-2*query(0,first_right),i}); } } while(!st.empty()){ auto [dis,i] = *st.begin(); st.erase(st.begin()); location[i] = first-dis; stype[i] = 1; vector<pll> torem; for(auto [dis2,j] : st){ // does j lie in between a[0] and i? (j is type D) if(query(first_right,i)+query(i,j) == query(first_right,j)){ torem.pb({dis2,j}); location[j] = location[i]+query(i,j); stype[j] = 2; } } trav(p,torem){ st.erase(p); } } // cout << endl; // rep(i,n){ // cout << stype[i] << " " << location[i] << endl; // } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...