제출 #493833

#제출 시각아이디문제언어결과실행 시간메모리
493833nathanlee726Robot (JOI21_ho_t4)C++14
34 / 100
3107 ms682988 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define int ll #define pii pair<int,int> #define X first #define Y second #define F(n) Fi(i,n) #define Fi(i,n) Fl(i,0,n) #define Fl(i,l,n) for(int i=l;i<n;i++) #define all(x) x.begin(),x.end() #define sz(x) ((int)x.size()) #define abs(x) ((x)>0?(x):-(x)) #define pb push_back int n,m,ind,rr[2000010],d[2000010]; vector<pair<pii,pii> >g[2000010],rg[2000010]; map<pii,int> mmp; bool used[2000010]; void calc(int x){ map<int,int> mp; for(auto pt:g[x]){ mp[pt.X.Y]+=pt.Y.X; } F(sz(g[x])){ g[x][i].Y.Y=mp[g[x][i].X.Y]-g[x][i].Y.X; } } signed main(){ ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>m; ind=n; F(m){ int a,b,c,d; cin>>a>>b>>c>>d; --a,--b; g[a].pb({{b,c},{d,0}}); g[b].pb({{a,c},{d,0}}); } F(n)calc(i),rg[i]=g[i]; vector<int> v; F(n){ int tt=sz(g[i]); Fi(j,tt){ mmp[{i,g[i][j].X.X}]=ind; rr[ind]=g[i][j].X.X; if(g[i][j].X.X==n-1)v.pb(ind); g[i].pb({{ind,-1},g[i][j].Y}); g[ind]=rg[g[i][j].X.X]; Fi(k,sz(g[ind])){ if(g[ind][k].X.X!=i&&g[ind][k].X.Y==g[i][j].X.Y)g[ind][k].Y.Y-=g[i][j].Y.X; //if(g[ind][k].Y.Y<0)cout<<"c "<<g[ind][k].X.X<<" "<<g[ind][k].X.Y<<" "<<g[ind][k].Y.X<<" "<<g[ind][k].Y.Y<<endl;; } ind++; } } F(ind)d[i]=1e18; for(int i=n;i<ind;i++){ for(auto pt:g[i]){ int u=mmp[{rr[i],pt.X.X}]; g[i].pb({{u,-1},{pt.Y}}); } } priority_queue<pii,vector<pii>,greater<pii> >pq; pq.push({0,0}); memset(used,0,sizeof(used)); while(!pq.empty()){ int p=pq.top().Y,ss=pq.top().X;pq.pop(); if(used[p])continue; d[p]=ss; //cout<<"a "<<p<<" "<<ss<<endl; used[p]=1; for(auto pt:g[p]){ if(pt.X.X>=n){ pq.push({ss+pt.Y.X,pt.X.X}); } else{ pq.push({ss+pt.Y.Y,pt.X.X}); } } } v.pb(n-1); int ans=1e18; //for(auto pt:g[6])cout<<pt.X.X<<" "<<pt.X.Y<<" "<<pt.Y.X<<" "<<pt.Y.Y<<endl; //cout<<d[4]<<endl; //F(n)cout<<d[i]<<" "; //cout<<endl; for(int i:v)ans=min(ans,d[i]); cout<<(ans>1e17?-1:ans)<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...