Submission #1130811

#TimeUsernameProblemLanguageResultExecution timeMemory
1130811aaa2312Toll (BOI17_toll)C++20
100 / 100
364 ms51704 KiB
#pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; using ll = long long; const ll mod = 1e9 + 7; const ll mod2 = 998244353; ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } ll pow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans *= a; b >>= 1; a *= a; } return ans; } ll pow(ll a, ll b, ll c) { ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % c; b >>= 1; a = (a * a) % c; } return ans; } void check(bool b) { if (b) cout << "Yes\n"; else cout << "No\n"; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); ll k,n,m,q; cin>>k>>n>>m>>q; ll l=log2(n/k+1)+1; vector<vector<vector<ll>>>anc(n,vector<vector<ll>>(l,vector<ll>(k,1e14))); while (m--){ ll a,b,t; cin>>a>>b>>t; anc[b][0][a%k]=min(anc[b][0][a%k],t); } for (int i = 1; i < l; ++i) { for (int j = 0; j < n; ++j) { for (int kk = 0; kk < k; ++kk) { for (int ll = 0; ll < k; ++ll) { anc[j][i][ll]=min(anc[j][i][ll], anc[j][i - 1][kk] + anc[max(0LL,(j/k-(1<<(i-1)))*k+kk)][i - 1][ll]); } } } } while (q--){ ll a,b; cin>>a>>b; if (a/k==b/k){ cout<<-1<<'\n'; continue; } ll le=b/k-a/k; vector<ll>dist(k,1e14); dist[b%k]=0; ll cul=b/k; for (int i = l-1; i >= 0; --i) { if (le&(1<<i)){ vector<ll>dist2(k,1e14); for (int j = 0; j < k; ++j) { for (int ll = 0; ll < k; ++ll) { if (cul*k+j<n) dist2[ll]=min(dist2[ll], dist[j] + anc[cul * k + j][i][ll]); } } cul-=1<<i; swap(dist,dist2); } } if (dist[a%k]==(ll)1e14){ cout<<-1<<'\n'; } else{ cout<<dist[a%k]<<'\n'; } } return 0; }
#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...