#include "shortcut.h"
#include <bits/stdc++.h>
#define endl '\n'
#define here cerr<<"=========================================\n"
#define dbg(x) cerr<<#x<<": "<<x<<endl;
#define ll long long
#define pb push_back
#define popb pop_back
#define all(a_) a_.begin(),a_.end()
#define pll pair<ll,ll>
#define sc second
#define fi first
#define llinf 1000000000000000LL
#define ceri(a,l,r) {cerr<<#a<<": ";for(ll i = l;i<=r;i++) cerr<<a[i]<< " ";cerr<<endl;}
using namespace std;
#define maxn 2005
#define lg 9
ll n,c,tsz;
vector<pll> g[maxn];
vector<ll> cyc,ps,curr;
ll cyclen;
bool naso = 0;
bool inc[maxn];
bool vis[maxn];
ll len[maxn][maxn];
ll id[maxn];
ll in[maxn],out[maxn];
ll st[maxn][lg];
ll dept[maxn];
ll mx[maxn][2];
ll t[4*maxn];
void init(ll v,ll tl,ll tr){
if(tl==tr){
t[v] = ps[tl] + mx[cyc[tl%(cyc.size())]][0];
return;
}
ll mid = (tl+tr)/2;
init(2*v,tl,mid);
init(2*v+1,mid+1,tr);
t[v] = max(t[2*v],t[2*v+1]);
}
ll get(ll v,ll tl,ll tr,ll l,ll r){
if(l>r||l>tr||tl>tr||tl>r) return -llinf;
if(tl>=l&&tr<=r) return t[v];
ll mid = (tl+tr)/2;
return max(get(2*v,tl,mid,l,r),get(2*v+1,mid+1,tr,l,r));
}
ll ti = 0;
ll cur;
void dfs2(ll u,ll par,ll poc){
id[u] = poc;
st[u][0] = par;
in[u] = ++ti;
if(g[u].size()==1) mx[u][0] = 0;
for(pll p : g[u]){
ll s = p.fi;
ll w = len[u][s];
if(inc[s]) continue;
if(s==par) continue;
dept[s] = dept[u] + w;
dfs2(s,u,poc);
vector<ll> v;
v.pb(mx[s][0] + w);
v.pb(mx[s][0] + w);
v.pb(mx[u][0]);
v.pb(mx[u][1]);
cur = max(cur,mx[u][0] + mx[s][0] + w);
sort(all(v));
mx[u][0] = v[3];
mx[u][1] = v[2];
}
out[u] = ti-1;
}
ll dis[maxn];
void dfs3(ll u,ll par){
for(pll p : g[u]){
ll s = p.fi;
ll w = len[u][s];
if(s==par) continue;
dis[s] = dis[u] + w;
dfs3(s,u);
}
}
ll naj(ll x){
for(ll i = 1;i<=tsz;i++) dis[i] = llinf;
dis[x] = 0;
dfs3(x,x);
ll ans = x;
for(ll i = 1;i<=tsz;i++) if(dis[i]>dis[ans]) ans = i;
return ans;
}
ll find_shortcut(int N, vector<int> L, vector<int> D, int C)
{
n = N;
tsz = n;
c = C;
for(ll i = 0;i<maxn;i++) for(ll j = 0;j<maxn;j++) len[i][j] = llinf;
for(ll i = 1;i<n;i++){
g[i].pb({i+1,L[i-1]});
g[i+1].pb({i,L[i-1]});
len[i][i+1] = len[i+1][i] = L[i-1];
}
for(ll i = 1;i<=n;i++) if(D[i-1]){
g[i].pb({++tsz,D[i-1]});
g[tsz].pb({i,D[i-1]});
len[i][tsz] = len[tsz][i] = D[i-1];
}
ll ans = llinf;
for(ll i = 1;i<=n;i++){
for(ll j = i+2;j<=n;j++){
g[i].pb({j,c});
g[j].pb({i,c});
len[i][j] = len[j][i] = c;
ti = 0;
for(ll k = 1;k<=tsz;k++) vis[k] = inc[k] = id[k] = in[k] = out[k] = dept[k] = 0;
for(ll k = 1;k<=tsz;k++) mx[k][0] = mx[k][1] = -llinf;
cyclen = 0;
cyc.clear();
ps.clear();
ps.pb(0);
for(ll k = i;k<=j;k++) cyc.pb(k),inc[k] = 1;
for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
cyclen = ps.back() + len[cyc[0]][cyc.back()];
ps.pb(cyclen);
for(ll k = 1;k<cyc.size();k++) ps.pb(ps.back() + len[cyc[k]][cyc[k-1]]);
cur = 0;
ll m = ps.size()-1;
for(ll k = 0;k<cyc.size();k++){
ll y = cyc[k];
st[y][0] = y;
dfs2(y,y,k);
if(g[y].size()==2) mx[y][0] = 0;
}
init(1,0,m);
ll f = 0;
for(ll e = 0;e<ps.size();e++){
while(f<ps.size()&&ps[f]-ps[e]<=cyclen/2) f++;
f--;
cur = max(cur,mx[cyc[e%(cyc.size())]][0] - ps[e] + get(1,0,m,e,f));
}
ps.clear();
ps.pb(0);
reverse(all(cyc));
for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
cyclen = ps.back() + len[cyc[0]][cyc.back()];
ps.pb(cyclen);
for(ll k = 1;k<cyc.size();k++) ps.pb(ps.back() + len[cyc[k]][cyc[k-1]]);
init(1,0,m);
f = 0;
for(ll e = 0;e<ps.size();e++){
while(f<ps.size()&&ps[f]-ps[e]<=cyclen/2) f++;
f--;
cur = max(cur,mx[cyc[e%(cyc.size())]][0] - ps[e] + get(1,0,m,e,f));
}
ans = min(ans,cur);
len[i][j] = len[j][i] = llinf;
g[i].popb();
g[j].popb();
}
}
for(ll i = 1;i<n;i++){
len[i][i+1] = len[i+1][i] = min((ll)L[i-1],c);
ll x = naj(1);
ll y = naj(x);
ans = min(ans,dis[y]);
len[i][i+1] = len[i+1][i] = L[i-1];
}
return ans;
}
/**
4 10
10 20 20
0 40 0 30
9 30
10 10 10 10 10 10 10 10
20 0 30 0 0 40 0 40 0
3 3
1 1
1 1 1
5 1
1 1 1 1
0 0 0 0 0
**/
Compilation message
shortcut.cpp: In function 'long long int find_shortcut(int, std::vector<int>, std::vector<int>, int)':
shortcut.cpp:116:62: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
116 | for(ll k = 1;k<=tsz;k++) vis[k] = inc[k] = id[k] = in[k] = out[k] = dept[k] = 0;
| ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
shortcut.cpp:123:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
123 | for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
| ~^~~~~~~~~~~
shortcut.cpp:126:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
126 | for(ll k = 1;k<cyc.size();k++) ps.pb(ps.back() + len[cyc[k]][cyc[k-1]]);
| ~^~~~~~~~~~~
shortcut.cpp:129:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
129 | for(ll k = 0;k<cyc.size();k++){
| ~^~~~~~~~~~~
shortcut.cpp:137:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
137 | for(ll e = 0;e<ps.size();e++){
| ~^~~~~~~~~~
shortcut.cpp:138:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
138 | while(f<ps.size()&&ps[f]-ps[e]<=cyclen/2) f++;
| ~^~~~~~~~~~
shortcut.cpp:145:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
145 | for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
| ~^~~~~~~~~~~
shortcut.cpp:148:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
148 | for(ll k = 1;k<cyc.size();k++) ps.pb(ps.back() + len[cyc[k]][cyc[k-1]]);
| ~^~~~~~~~~~~
shortcut.cpp:151:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
151 | for(ll e = 0;e<ps.size();e++){
| ~^~~~~~~~~~
shortcut.cpp:152:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
152 | while(f<ps.size()&&ps[f]-ps[e]<=cyclen/2) f++;
| ~^~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
31828 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
16 ms |
31760 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
16 ms |
31784 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
19 ms |
31812 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
14 ms |
31792 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
16 ms |
31784 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
17 ms |
31832 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
16 ms |
31828 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
14 ms |
31728 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
15 ms |
31808 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
19 ms |
31764 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
17 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
20 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
14 ms |
31772 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
16 ms |
31752 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
15 ms |
31852 KB |
n = 5, 4000000000 is a correct answer |
17 |
Incorrect |
15 ms |
31828 KB |
n = 10, incorrect answer: jury 1000000343 vs contestant 1000000623 |
18 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
31828 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
16 ms |
31760 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
16 ms |
31784 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
19 ms |
31812 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
14 ms |
31792 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
16 ms |
31784 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
17 ms |
31832 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
16 ms |
31828 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
14 ms |
31728 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
15 ms |
31808 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
19 ms |
31764 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
17 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
20 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
14 ms |
31772 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
16 ms |
31752 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
15 ms |
31852 KB |
n = 5, 4000000000 is a correct answer |
17 |
Incorrect |
15 ms |
31828 KB |
n = 10, incorrect answer: jury 1000000343 vs contestant 1000000623 |
18 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
31828 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
16 ms |
31760 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
16 ms |
31784 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
19 ms |
31812 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
14 ms |
31792 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
16 ms |
31784 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
17 ms |
31832 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
16 ms |
31828 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
14 ms |
31728 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
15 ms |
31808 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
19 ms |
31764 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
17 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
20 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
14 ms |
31772 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
16 ms |
31752 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
15 ms |
31852 KB |
n = 5, 4000000000 is a correct answer |
17 |
Incorrect |
15 ms |
31828 KB |
n = 10, incorrect answer: jury 1000000343 vs contestant 1000000623 |
18 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
31828 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
16 ms |
31760 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
16 ms |
31784 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
19 ms |
31812 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
14 ms |
31792 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
16 ms |
31784 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
17 ms |
31832 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
16 ms |
31828 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
14 ms |
31728 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
15 ms |
31808 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
19 ms |
31764 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
17 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
20 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
14 ms |
31772 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
16 ms |
31752 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
15 ms |
31852 KB |
n = 5, 4000000000 is a correct answer |
17 |
Incorrect |
15 ms |
31828 KB |
n = 10, incorrect answer: jury 1000000343 vs contestant 1000000623 |
18 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
31828 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
16 ms |
31760 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
16 ms |
31784 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
19 ms |
31812 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
14 ms |
31792 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
16 ms |
31784 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
17 ms |
31832 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
16 ms |
31828 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
14 ms |
31728 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
15 ms |
31808 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
19 ms |
31764 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
17 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
20 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
14 ms |
31772 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
16 ms |
31752 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
15 ms |
31852 KB |
n = 5, 4000000000 is a correct answer |
17 |
Incorrect |
15 ms |
31828 KB |
n = 10, incorrect answer: jury 1000000343 vs contestant 1000000623 |
18 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
31828 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
16 ms |
31760 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
16 ms |
31784 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
19 ms |
31812 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
14 ms |
31792 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
16 ms |
31784 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
17 ms |
31832 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
16 ms |
31828 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
14 ms |
31728 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
15 ms |
31808 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
19 ms |
31764 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
17 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
20 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
14 ms |
31772 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
16 ms |
31752 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
15 ms |
31852 KB |
n = 5, 4000000000 is a correct answer |
17 |
Incorrect |
15 ms |
31828 KB |
n = 10, incorrect answer: jury 1000000343 vs contestant 1000000623 |
18 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
31828 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
16 ms |
31760 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
16 ms |
31784 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
19 ms |
31812 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
14 ms |
31792 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
16 ms |
31784 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
17 ms |
31832 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
16 ms |
31828 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
14 ms |
31728 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
15 ms |
31808 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
19 ms |
31764 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
17 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
20 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
14 ms |
31772 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
16 ms |
31752 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
15 ms |
31852 KB |
n = 5, 4000000000 is a correct answer |
17 |
Incorrect |
15 ms |
31828 KB |
n = 10, incorrect answer: jury 1000000343 vs contestant 1000000623 |
18 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
15 ms |
31828 KB |
n = 4, 80 is a correct answer |
2 |
Correct |
16 ms |
31760 KB |
n = 9, 110 is a correct answer |
3 |
Correct |
16 ms |
31784 KB |
n = 4, 21 is a correct answer |
4 |
Correct |
19 ms |
31812 KB |
n = 3, 4 is a correct answer |
5 |
Correct |
14 ms |
31792 KB |
n = 2, 62 is a correct answer |
6 |
Correct |
16 ms |
31784 KB |
n = 2, 3 is a correct answer |
7 |
Correct |
17 ms |
31832 KB |
n = 3, 29 is a correct answer |
8 |
Correct |
16 ms |
31828 KB |
n = 2, 3 is a correct answer |
9 |
Correct |
14 ms |
31728 KB |
n = 2, 3 is a correct answer |
10 |
Correct |
15 ms |
31808 KB |
n = 2, 2000000001 is a correct answer |
11 |
Correct |
19 ms |
31764 KB |
n = 2, 3000000000 is a correct answer |
12 |
Correct |
17 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
13 |
Correct |
20 ms |
31828 KB |
n = 3, 3000000000 is a correct answer |
14 |
Correct |
14 ms |
31772 KB |
n = 4, 3000000001 is a correct answer |
15 |
Correct |
16 ms |
31752 KB |
n = 4, 4000000000 is a correct answer |
16 |
Correct |
15 ms |
31852 KB |
n = 5, 4000000000 is a correct answer |
17 |
Incorrect |
15 ms |
31828 KB |
n = 10, incorrect answer: jury 1000000343 vs contestant 1000000623 |
18 |
Halted |
0 ms |
0 KB |
- |