# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
187248 | PedroBigMan | Shortcut (IOI16_shortcut) | C++14 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include "shortcut.h"
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef long double ld;
#define REP(i,a,b) for(ll i=a; i<b; i++)
#define pb push_back
#define mp make_pair
#define pl pair<ll,ll>
#define ff first
#define ss second
#define INF 100000000000000000LL
ll insig;
#define In(vecBRO, LENBRO) REP(IBRO,0,LENBRO) {cin>>insig; vecBRO.pb(insig);}
void Out(vector<ll> x) {REP(i,0,x.size()) {cout<<x[i]<<" ";} cout<<endl;}
class WG //everything works for weighted directed graphs
{
public:
ll N; vector<vector<pl> > adj;
vector<ll> pr;
WG(vector<vector<pl> > ad)
{
adj=ad; N=adj.size();
REP(i,0,N) {pr.pb(false);}
}
void Reset()
{
REP(i,0,N) {pr[i]=false;}
}
vector<ll> Djikstra(ll s)
{
Reset();
vector<ll> d; REP(i,0,N) {d.pb(INF);}
d[s]=0;
priority_queue<pl> q;
q.push(mp(0,s));
ll cur;
while(!q.empty())
{
cur=q.top().ss; q.pop();
if(pr[cur]) {continue;}
pr[cur]=true;
REP(i,0,adj[cur].size())
{
if(d[adj[cur][i].ff]>d[cur]+adj[cur][i].ss)
{
d[adj[cur][i].ff]=d[cur]+adj[cur][i].ss;
q.push(mp(-d[adj[cur][i].ff],adj[cur][i].ff));
}
}
}
return d;
}
};
ll find_shortcut(int n, std::vector<int> lll, std::vector<int> ddd, int ccc)
{
ll N=(ll) n; ll c=(ll) ccc;
vector<ll> l,r;
REP(i,0,lll.size()) {l.pb((ll) lll[i]);}
REP(i,0,ddd.size()) {r.pb((ll) ddd[i]);}
vector<vector<pl> > adj; vector<pl> xx; REP(i,0,2*N) {adj.pb(xx);}
REP(i,0,l.size())
{
adj[i].pb(mp(i+1,l[i]));
adj[i+1].pb(mp(i,l[i]));
}
REP(i,0,r.size())
{
adj[i].pb(mp(N+i,r[i]));
adj[N+i].pb(mp(i,r[i]));
}
WG G(adj);
ll ans=INF;
REP(a,0,N)
{
REP(b,a+1,N)
{
G.adj[a].pb(mp(b,c));
G.adj[b].pb(mp(a,c));
vector<ll> d=G.Djikstra(0);
ll mav=-INF; ll ind=0;
REP(i,1,2*N) {if(d[i]>mav) {mav=d[i]; ind=i;}}
d.clear();
d=G.Djikstra(ind);
mav=-INF; ll ind=0;
REP(i,1,2*N) {if(d[i]>mav) {mav=d[i]; ind=i;}}
ans=min(ans,mav);
G.adj[a].pop_back();
G.adj[b].pop_back();
}
}
return ans;
}