Submission #729169

# Submission time Handle Problem Language Result Execution time Memory
729169 2023-04-23T15:11:27 Z grogu Shortcut (IOI16_shortcut) C++14
0 / 100
2 ms 2260 KB
#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 505
#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 ti = 0;
void dfs2(ll u,ll par,ll poc){
    id[u] = poc;
    st[u][0] = par;
    in[u] = ++ti;
    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);
    }
    out[u] = ti-1;
}
bool intree(ll x,ll y){return in[y]<=in[x]&&out[y]>=out[x];}
ll lca(ll x,ll y){
    if(intree(x,y)) return y;
    if(intree(y,x)) return x;
    for(ll j = lg-1;j>=0;j--){
        if(!intree(x,st[y][j])) y = st[y][j];
    }
    return st[y][0];
}
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;
            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()];
            for(ll k = 0;k<cyc.size();k++){
                ll y = cyc[k];
                st[y][0] = y;
                dfs2(y,y,k);
            }
            for(ll e = 1;e<lg;e++) for(ll k = 1;k<=tsz;k++) st[k][e] = st[st[k][e-1]][e-1];
            vector<ll> lif;
            for(ll k = 1;k<=tsz;k++) if(g[k].size()==1) lif.pb(k);
            ll cur = 0;
            if(lif.size()==0){
                for(ll e = 0;e<cyc.size();e++){
                    for(ll f = e+1;f<cyc.size();f++){
                        ll idx = e,idy = f;
                        if(idx<idy) swap(idx,idy);
                        ll r = ps[idx] - ps[idy];
                        cur = max(cur,min(r,cyclen-r));
                    }
                }
            }
            if(lif.size()==1){
                ll x = lif[0];
                for(ll k = 0;k<cyc.size();k++){
                    ll idx = id[x];
                    ll idy = k;
                    if(idx<idy) swap(idx,idy);
                    ll r = ps[idx] - ps[idy];
                    cur = max(cur,dept[x]+min(r,cyclen-r));
                }
            }
            for(ll e = 0;e<lif.size();e++){
                for(ll f = e+1;f<lif.size();f++){
                    ll x = lif[e],y = lif[f];
                    ll idx = id[x],idy = id[y];
                    if(idx<idy) swap(idx,idy);
                    ll r = ps[idx] - ps[idy];
                    if(idx==idy) cur = max(cur,dept[x]+dept[y]-2*dept[lca(x,y)]);
                    else cur = max(cur,dept[x] + dept[y] + min(cyclen-r,r));
                }
            }
            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:96:62: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   96 |             for(ll k = 1;k<=tsz;k++) vis[k] = inc[k] = id[k] = in[k] = out[k] = dept[k] = 0;
      |                                                        ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
shortcut.cpp:102: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]
  102 |             for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
      |                          ~^~~~~~~~~~~
shortcut.cpp:104: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]
  104 |             for(ll k = 0;k<cyc.size();k++){
      |                          ~^~~~~~~~~~~
shortcut.cpp:114:31: 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]
  114 |                 for(ll e = 0;e<cyc.size();e++){
      |                              ~^~~~~~~~~~~
shortcut.cpp:115:37: 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]
  115 |                     for(ll f = e+1;f<cyc.size();f++){
      |                                    ~^~~~~~~~~~~
shortcut.cpp:125:31: 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]
  125 |                 for(ll k = 0;k<cyc.size();k++){
      |                              ~^~~~~~~~~~~
shortcut.cpp:133: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]
  133 |             for(ll e = 0;e<lif.size();e++){
      |                          ~^~~~~~~~~~~
shortcut.cpp:134:33: 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]
  134 |                 for(ll f = e+1;f<lif.size();f++){
      |                                ~^~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2260 KB n = 4, 80 is a correct answer
2 Correct 2 ms 2260 KB n = 9, 110 is a correct answer
3 Correct 2 ms 2260 KB n = 4, 21 is a correct answer
4 Correct 1 ms 2236 KB n = 3, 4 is a correct answer
5 Correct 1 ms 2260 KB n = 2, 62 is a correct answer
6 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
7 Correct 1 ms 2260 KB n = 3, 29 is a correct answer
8 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
9 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
10 Correct 2 ms 2260 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 2260 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 2260 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 2236 KB n = 3, 3000000000 is a correct answer
14 Correct 2 ms 2260 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 2260 KB n = 4, 4000000000 is a correct answer
16 Correct 2 ms 2244 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 2240 KB n = 10, 1000000343 is a correct answer
18 Correct 2 ms 2260 KB n = 10, 3189 is a correct answer
19 Correct 2 ms 2260 KB n = 10, 7000000000 is a correct answer
20 Correct 1 ms 2260 KB n = 5, 12 is a correct answer
21 Incorrect 1 ms 2260 KB n = 5, incorrect answer: jury 25 vs contestant 16
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2260 KB n = 4, 80 is a correct answer
2 Correct 2 ms 2260 KB n = 9, 110 is a correct answer
3 Correct 2 ms 2260 KB n = 4, 21 is a correct answer
4 Correct 1 ms 2236 KB n = 3, 4 is a correct answer
5 Correct 1 ms 2260 KB n = 2, 62 is a correct answer
6 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
7 Correct 1 ms 2260 KB n = 3, 29 is a correct answer
8 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
9 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
10 Correct 2 ms 2260 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 2260 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 2260 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 2236 KB n = 3, 3000000000 is a correct answer
14 Correct 2 ms 2260 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 2260 KB n = 4, 4000000000 is a correct answer
16 Correct 2 ms 2244 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 2240 KB n = 10, 1000000343 is a correct answer
18 Correct 2 ms 2260 KB n = 10, 3189 is a correct answer
19 Correct 2 ms 2260 KB n = 10, 7000000000 is a correct answer
20 Correct 1 ms 2260 KB n = 5, 12 is a correct answer
21 Incorrect 1 ms 2260 KB n = 5, incorrect answer: jury 25 vs contestant 16
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2260 KB n = 4, 80 is a correct answer
2 Correct 2 ms 2260 KB n = 9, 110 is a correct answer
3 Correct 2 ms 2260 KB n = 4, 21 is a correct answer
4 Correct 1 ms 2236 KB n = 3, 4 is a correct answer
5 Correct 1 ms 2260 KB n = 2, 62 is a correct answer
6 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
7 Correct 1 ms 2260 KB n = 3, 29 is a correct answer
8 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
9 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
10 Correct 2 ms 2260 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 2260 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 2260 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 2236 KB n = 3, 3000000000 is a correct answer
14 Correct 2 ms 2260 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 2260 KB n = 4, 4000000000 is a correct answer
16 Correct 2 ms 2244 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 2240 KB n = 10, 1000000343 is a correct answer
18 Correct 2 ms 2260 KB n = 10, 3189 is a correct answer
19 Correct 2 ms 2260 KB n = 10, 7000000000 is a correct answer
20 Correct 1 ms 2260 KB n = 5, 12 is a correct answer
21 Incorrect 1 ms 2260 KB n = 5, incorrect answer: jury 25 vs contestant 16
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2260 KB n = 4, 80 is a correct answer
2 Correct 2 ms 2260 KB n = 9, 110 is a correct answer
3 Correct 2 ms 2260 KB n = 4, 21 is a correct answer
4 Correct 1 ms 2236 KB n = 3, 4 is a correct answer
5 Correct 1 ms 2260 KB n = 2, 62 is a correct answer
6 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
7 Correct 1 ms 2260 KB n = 3, 29 is a correct answer
8 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
9 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
10 Correct 2 ms 2260 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 2260 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 2260 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 2236 KB n = 3, 3000000000 is a correct answer
14 Correct 2 ms 2260 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 2260 KB n = 4, 4000000000 is a correct answer
16 Correct 2 ms 2244 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 2240 KB n = 10, 1000000343 is a correct answer
18 Correct 2 ms 2260 KB n = 10, 3189 is a correct answer
19 Correct 2 ms 2260 KB n = 10, 7000000000 is a correct answer
20 Correct 1 ms 2260 KB n = 5, 12 is a correct answer
21 Incorrect 1 ms 2260 KB n = 5, incorrect answer: jury 25 vs contestant 16
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2260 KB n = 4, 80 is a correct answer
2 Correct 2 ms 2260 KB n = 9, 110 is a correct answer
3 Correct 2 ms 2260 KB n = 4, 21 is a correct answer
4 Correct 1 ms 2236 KB n = 3, 4 is a correct answer
5 Correct 1 ms 2260 KB n = 2, 62 is a correct answer
6 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
7 Correct 1 ms 2260 KB n = 3, 29 is a correct answer
8 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
9 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
10 Correct 2 ms 2260 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 2260 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 2260 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 2236 KB n = 3, 3000000000 is a correct answer
14 Correct 2 ms 2260 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 2260 KB n = 4, 4000000000 is a correct answer
16 Correct 2 ms 2244 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 2240 KB n = 10, 1000000343 is a correct answer
18 Correct 2 ms 2260 KB n = 10, 3189 is a correct answer
19 Correct 2 ms 2260 KB n = 10, 7000000000 is a correct answer
20 Correct 1 ms 2260 KB n = 5, 12 is a correct answer
21 Incorrect 1 ms 2260 KB n = 5, incorrect answer: jury 25 vs contestant 16
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2260 KB n = 4, 80 is a correct answer
2 Correct 2 ms 2260 KB n = 9, 110 is a correct answer
3 Correct 2 ms 2260 KB n = 4, 21 is a correct answer
4 Correct 1 ms 2236 KB n = 3, 4 is a correct answer
5 Correct 1 ms 2260 KB n = 2, 62 is a correct answer
6 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
7 Correct 1 ms 2260 KB n = 3, 29 is a correct answer
8 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
9 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
10 Correct 2 ms 2260 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 2260 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 2260 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 2236 KB n = 3, 3000000000 is a correct answer
14 Correct 2 ms 2260 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 2260 KB n = 4, 4000000000 is a correct answer
16 Correct 2 ms 2244 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 2240 KB n = 10, 1000000343 is a correct answer
18 Correct 2 ms 2260 KB n = 10, 3189 is a correct answer
19 Correct 2 ms 2260 KB n = 10, 7000000000 is a correct answer
20 Correct 1 ms 2260 KB n = 5, 12 is a correct answer
21 Incorrect 1 ms 2260 KB n = 5, incorrect answer: jury 25 vs contestant 16
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2260 KB n = 4, 80 is a correct answer
2 Correct 2 ms 2260 KB n = 9, 110 is a correct answer
3 Correct 2 ms 2260 KB n = 4, 21 is a correct answer
4 Correct 1 ms 2236 KB n = 3, 4 is a correct answer
5 Correct 1 ms 2260 KB n = 2, 62 is a correct answer
6 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
7 Correct 1 ms 2260 KB n = 3, 29 is a correct answer
8 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
9 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
10 Correct 2 ms 2260 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 2260 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 2260 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 2236 KB n = 3, 3000000000 is a correct answer
14 Correct 2 ms 2260 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 2260 KB n = 4, 4000000000 is a correct answer
16 Correct 2 ms 2244 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 2240 KB n = 10, 1000000343 is a correct answer
18 Correct 2 ms 2260 KB n = 10, 3189 is a correct answer
19 Correct 2 ms 2260 KB n = 10, 7000000000 is a correct answer
20 Correct 1 ms 2260 KB n = 5, 12 is a correct answer
21 Incorrect 1 ms 2260 KB n = 5, incorrect answer: jury 25 vs contestant 16
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2260 KB n = 4, 80 is a correct answer
2 Correct 2 ms 2260 KB n = 9, 110 is a correct answer
3 Correct 2 ms 2260 KB n = 4, 21 is a correct answer
4 Correct 1 ms 2236 KB n = 3, 4 is a correct answer
5 Correct 1 ms 2260 KB n = 2, 62 is a correct answer
6 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
7 Correct 1 ms 2260 KB n = 3, 29 is a correct answer
8 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
9 Correct 1 ms 2260 KB n = 2, 3 is a correct answer
10 Correct 2 ms 2260 KB n = 2, 2000000001 is a correct answer
11 Correct 1 ms 2260 KB n = 2, 3000000000 is a correct answer
12 Correct 1 ms 2260 KB n = 3, 3000000000 is a correct answer
13 Correct 1 ms 2236 KB n = 3, 3000000000 is a correct answer
14 Correct 2 ms 2260 KB n = 4, 3000000001 is a correct answer
15 Correct 1 ms 2260 KB n = 4, 4000000000 is a correct answer
16 Correct 2 ms 2244 KB n = 5, 4000000000 is a correct answer
17 Correct 1 ms 2240 KB n = 10, 1000000343 is a correct answer
18 Correct 2 ms 2260 KB n = 10, 3189 is a correct answer
19 Correct 2 ms 2260 KB n = 10, 7000000000 is a correct answer
20 Correct 1 ms 2260 KB n = 5, 12 is a correct answer
21 Incorrect 1 ms 2260 KB n = 5, incorrect answer: jury 25 vs contestant 16
22 Halted 0 ms 0 KB -