Submission #1127522

#TimeUsernameProblemLanguageResultExecution timeMemory
1127522lamReconstruction Project (JOI22_reconstruction)C++20
14 / 100
5095 ms26328 KiB
#include<bits/stdc++.h> #define ll long long #define mod (ll)(1e9+7) #define ntr "\n" #define taskname "RAILROAD" #define frep freopen(taskname".inp","r",stdin); freopen("RAILROAD.out","w",stdout); using namespace std; vector<ll> adj[501][501]; vector<array<ll,3>> edges; ll p[501][501]; ll par[501],sz[501]; inline ll find_par(ll u){ return (u==par[u]?u:par[u]=find_par(par[u])); } inline bool uni(ll u,ll v){ u=find_par(u); v=find_par(v); if(u==v) return 0; if(sz[u]<sz[v]) swap(u,v); par[v]=u; sz[u]+=sz[v]; //cout<<"connect "<<u<<' '<<v<<ntr; return 1; } ll n,m,q; void sub3(){ for(int i=1;i<n;i++){ sort(adj[i][i+1].begin(),adj[i][i+1].end()); } while(q--){ ll x; cin>>x; ll ans=0; for(int i=2;i<=n;i++){ if(adj[i-1][i].size()==0){ ans=-1; break; } while(p[i-1][i]<adj[i-1][i].size()){ if(adj[i-1][i][p[i-1][i]]<=x) p[i-1][i]++; else break; } if(p[i-1][i]==0) ans+=adj[i-1][i][p[i-1][i]]-x; else if(p[i-1][i]==adj[i-1][i].size()) ans+=x-adj[i-1][i].back(); else ans+=min(adj[i-1][i][p[i-1][i]]-x,x-adj[i-1][i][p[i-1][i]-1]); } cout<<ans<<ntr; } } void sub5(){ ll pos=0; sort(edges.begin(),edges.end()); while(q--){ ll x; cin>>x; for(int i=1;i<=n;i++) par[i]=i,sz[i]=1; ll ans=0; while(pos<m){ if(edges[pos][0]<=x) pos++; else break; } ll p1=pos-1,p2=pos; while(p1>=0||p2<m){ if(sz[find_par(1)]==n) break; // cout<<ans<<ntr; if(p1<0){ // cout<<edges[p2][0]<<' '<<edges[p2][1]<<' '<<edges[p2][2]<<ntr; if(uni(edges[p2][1],edges[p2][2])) ans+=edges[p2][0]-x; p2++; } else if(p2>=m){ // cout<<edges[p1][0]<<' '<<edges[p1][1]<<' '<<edges[p1][2]<<ntr; if(uni(edges[p1][1],edges[p1][2])) ans+=x-edges[p1][0]; p1--; } else{ if(edges[p2][0]-x<x-edges[p1][0]){ // cout<<edges[p2][0]<<' '<<edges[p2][1]<<' '<<edges[p2][2]<<ntr; if(uni(edges[p2][1],edges[p2][2])) ans+=edges[p2][0]-x; p2++; } else{ // cout<<edges[p1][0]<<' '<<edges[p1][1]<<' '<<edges[p1][2]<<ntr; if(uni(edges[p1][1],edges[p1][2])) ans+=x-edges[p1][0]; p1--; } } } if(sz[find_par(1)]==n) cout<<ans<<ntr; else cout<<-1<<ntr; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>m; ll mx=0; for(int i=1;i<=m;i++){ ll a,b,c; cin>>a>>b>>c; mx=max(mx,abs(a-b)); adj[a][b].push_back(c); adj[b][a].push_back(c); edges.push_back({c,a,b}); } cin>>q; if(mx<=1) sub3(); else sub5(); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...