Submission #1274329

#TimeUsernameProblemLanguageResultExecution timeMemory
1274329quan606303Robot (JOI21_ho_t4)C++20
34 / 100
3092 ms45268 KiB
/* * @Author: RMQuan * @Date: 2025-09-29 22:50:45 * @Last Modified by: RMQuan * @Last Modified time: 2025-09-30 06:20:22 */ /*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 canh { int u,v,w,col; }; vector<canh> adj[maxn]; int n,m; vector<int> dis[maxn]; vector<int> vst[maxn]; vector<int> avaiable_col[maxn]; struct node { int u,prev_col,dis; }; struct cmp { bool operator()(const node &x,const node &y)const{ return x.dis>y.dis; } }; 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,col,w; cin>>u>>v>>col>>w; adj[u].push_back({u,v,w,col}); adj[v].push_back({v,u,w,col}); avaiable_col[u].push_back(col); avaiable_col[v].push_back(col); } for(int i=1;i<=n;i++) { avaiable_col[i].push_back(-inf); sort(avaiable_col[i].begin(),avaiable_col[i].end()); avaiable_col[i].erase(unique(avaiable_col[i].begin(),avaiable_col[i].end()),avaiable_col[i].end()); int sz=avaiable_col[i].size(); dis[i].assign(sz,inf); vst[i].assign(sz,0); } priority_queue<node,vector<node>,cmp> q; dis[1][0]=0; q.push({1,0,0}); while(!q.empty()) { int u=q.top().u; int col=q.top().prev_col; int du=q.top().dis; q.pop(); if(vst[u][col]) continue; vst[u][col]=true; for(auto &e:adj[u]) { cnt_w[e.col]+=e.w; cnt[e.col]++; } if(col==0) { for(int j=1;j<(int)avaiable_col[u].size();j++) { int c=avaiable_col[u][j]; for(auto &e:adj[u]) if(e.col==c) { int v=e.v; if(cnt[c]<=1) { if(dis[v][0]>du) { dis[v][0]=du; q.push({v,0,du}); } } else { int n_c=lower_bound(avaiable_col[v].begin(),avaiable_col[v].end(),c)-avaiable_col[v].begin(); if(dis[v][n_c]>du) { dis[v][n_c]=du; q.push({v,n_c,du}); } if(dis[v][0]>du+e.w) { dis[v][0]=du+e.w; q.push({v,0,dis[v][0]}); } if(dis[v][0]>du+cnt_w[c]-e.w) { dis[v][0]=du+cnt_w[c]-e.w; q.push({v,0,dis[v][0]}); } } } } } else { int pv_col=avaiable_col[u][col]; for(auto &e:adj[u]) if(e.col==pv_col) { int v=e.v; if(dis[v][0]>du+cnt_w[pv_col]-e.w) { dis[v][0]=du+cnt_w[pv_col]-e.w; q.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...