Submission #1274332

#TimeUsernameProblemLanguageResultExecution timeMemory
1274332quan606303Robot (JOI21_ho_t4)C++20
34 / 100
3097 ms64064 KiB
/* * @Author: RMQuan * @Date: 2025-09-29 22:50:45 * @Last Modified by: RMQuan * @Last Modified time: 2025-09-30 06:55:33 */ /*idea : */ #include <bits/stdc++.h> bool M1; #define int long long #define ll long long #define fi first #define se second #define memfull(a,b) memset(a,b,sizeof(a)); #define endl '\n' #define file(a) freopen(a".inp","r",stdin); freopen(a".out","w",stdout); using namespace std; const int maxn=2e5+7; const int inf=1e18; struct Edge {int to,w,col;}; int n,m; vector<Edge> adj[maxn]; vector<int> avaiable_col[maxn]; vector<vector<pair<int,int>>> g[maxn]; vector<int> dis[maxn], vst[maxn]; struct node { int u,idx,dist; }; struct cmp { bool operator()(const node &a,const node &b) const { return a.dist>b.dist; } }; int cnt_w[maxn], cnt[maxn]; int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; for(int i=1;i<=m;i++) { int u,v,c,w; cin>>u>>v>>c>>w; adj[u].push_back({v,w,c}); adj[v].push_back({u,w,c}); avaiable_col[u].push_back(c); avaiable_col[v].push_back(c); } for(int u=1;u<=n;u++) { avaiable_col[u].push_back(-inf); sort(avaiable_col[u].begin(),avaiable_col[u].end()); avaiable_col[u].erase(unique(avaiable_col[u].begin(),avaiable_col[u].end()),avaiable_col[u].end()); int sz=avaiable_col[u].size(); dis[u].assign(sz,inf); vst[u].assign(sz,0); g[u].assign(sz,{}); for(auto &e:adj[u]) { int idx=lower_bound(avaiable_col[u].begin(),avaiable_col[u].end(),e.col)-avaiable_col[u].begin(); g[u][idx].push_back({e.to,e.w}); } } priority_queue<node,vector<node>,cmp> pq; dis[1][0]=0; pq.push({1,0,0}); while(!pq.empty()) { auto cur=pq.top(); pq.pop(); int u=cur.u, idx=cur.idx, du=cur.dist; if(vst[u][idx]) continue; vst[u][idx]=true; for(auto &e:adj[u]) { cnt_w[e.col]+=e.w; cnt[e.col]++; } if(idx==0) { for(int j=1;j<(int)avaiable_col[u].size();j++) { int c=avaiable_col[u][j]; for(auto &e:g[u][j]) { int v=e.fi, w=e.se; if(cnt[c]<=1) { if(dis[v][0]>du) { dis[v][0]=du; pq.push({v,0,du}); } } else { int nc=lower_bound(avaiable_col[v].begin(),avaiable_col[v].end(),c)-avaiable_col[v].begin(); if(dis[v][nc]>du) { dis[v][nc]=du; pq.push({v,nc,du}); } if(dis[v][0]>du+w) { dis[v][0]=du+w; pq.push({v,0,dis[v][0]}); } if(dis[v][0]>du+cnt_w[c]-w) { dis[v][0]=du+cnt_w[c]-w; pq.push({v,0,dis[v][0]}); } } } } } else { int c=avaiable_col[u][idx]; for(auto &e:g[u][idx]) { int v=e.fi, w=e.se; if(dis[v][0]>du+cnt_w[c]-w) { dis[v][0]=du+cnt_w[c]-w; pq.push({v,0,dis[v][0]}); } } } for(auto &e:adj[u]) { cnt_w[e.col]-=e.w; cnt[e.col]--; } } cout<<(dis[n][0]==inf?-1:dis[n][0])<<endl; bool M2; cerr<<"-------------------------------------------------\n"; cerr<<"Time : "<<clock()<<" ms\n"; cerr<<"Memory : "<<abs(&M2-&M1)/1024/1024<<" MB\n"; cerr<<"-------------------------------------------------\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...