Submission #1300548

#TimeUsernameProblemLanguageResultExecution timeMemory
1300548quanduongxuan12Toll (BOI17_toll)C++20
100 / 100
203 ms94644 KiB
#include <bits/stdc++.h> using namespace std; #define name "optcost" #define MAXN 50004 #define pb push_back #define pf push_front #define ll long long #define ii pair<int, int> #define fs first #define sc second #define ill pair<int, ll> #define lli pair<ll, int> #define llll pair<ll, ll> #define all(v) v.begin(),v.end() #define uni(v) v.erase(unique(all(v)),v.end()) #define bit(n,i) (((n)>>(i))&1) #define FOR(i,a,b) for (int i=(a),_b=(b); i<=_b; i++) #define FORD(i,a,b) for (int i=(a),_b=(b); i>=_b; i--) #define MASK(i) (1LL<<(i)) const int INF=1e9; const int MOD=1e9+7; void add(int &u, int v){ u+=v; if (u>=MOD) u-=MOD; } void sub(int &u, int v){ u-=v; if (u<0) u+=MOD; } void minimize(int &u, int v){ u=min(u,v); } void maximize(int &u, int v){ u=max(u,v); } long long Rand(long long l, long long r){ ll tmp=0; FOR(i,1,4) tmp=((tmp<<15)^(((1<<15)-1)&rand())); return l+tmp%(r-l+1); } int k,n,m,q; struct Edge{ int x,y,w; }e[(int)1e6+7]; ii query[(int)1e4+7]; map<ii,int> mp; const int LOG=15; int spa[MAXN][LOG+1][5][5]; int dp[5],f[5]; int group[MAXN]; vector<int> vec[MAXN]; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin>>k>>n>>m>>q; FOR(i,1,m) cin>>e[i].x>>e[i].y>>e[i].w; FOR(i,1,q) cin>>query[i].fs>>query[i].sc; FOR(i,1,m){ ++e[i].x; ++e[i].y; } FOR(i,1,q){ ++query[i].fs; ++query[i].sc; } FOR(i,1,m){ mp[(ii){e[i].x,e[i].y}]=e[i].w; } FOR(i,1,n) group[i]=(i%k==0?(int)i/k:(int)i/k+1); FOR(i,1,n) vec[group[i]].pb(i); memset(spa,0x3f,sizeof(spa)); FOR(layer,1,group[n]-1){ for (int i:vec[layer]){ int x=i%k; for (int j:vec[layer+1]){ int y=j%k; if (mp.find((ii){i,j})!=mp.end()) spa[layer][0][x][y]=mp[(ii){i,j}]; } } } FOR(w,1,LOG){ FOR(layer,1,group[n]-MASK(w)){ for (int i:vec[layer]){ int x=i%k; for (int j:vec[layer+MASK(w)]){ int y=j%k; for (int u:vec[layer+MASK(w-1)]){ int z=u%k; minimize(spa[layer][w][x][y],spa[layer][w-1][x][z]+spa[layer+MASK(w-1)][w-1][z][y]); } } } } } FOR(id,1,q){ int u=query[id].fs,v=query[id].sc; FOR(i,0,k-1) dp[i]=spa[0][0][0][0]; dp[u%k]=0; int cur=group[u]; FORD(w,LOG,0){ if (cur+MASK(w)<=group[v]){ FOR(j,0,4) f[j]=spa[0][0][0][0]; FOR(i,0,4){ FOR(j,0,4){ minimize(f[j],dp[i]+spa[cur][w][i][j]); } } FOR(i,0,4) dp[i]=f[i]; cur+=MASK(w); } } cout<<(dp[v%k]>INF?-1:dp[v%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...