답안 #729228

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
729228 2023-04-23T17:06:19 Z grogu Shortcut (IOI16_shortcut) C++14
0 / 100
1 ms 468 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 4005
        #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];
        pll t[4*maxn];
        void init(ll v,ll tl,ll tr){
            if(tl==tr){
                t[v].fi = ps[tl] + mx[cyc[tl%(cyc.size())]][0];
                t[v].sc = ps[tl] + cyclen - 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].fi = max(t[2*v].fi,t[2*v+1].fi);
            t[v].sc = max(t[2*v].sc,t[2*v+1].sc);
        }
        pll mrg(pll a,pll b){return {max(a.fi,b.fi),max(a.sc,b.sc)};}
        pll get(ll v,ll tl,ll tr,ll l,ll r){
            if(l>r||l>tr||tl>tr||tl>r) return {-llinf,-llinf};
            if(tl>=l&&tr<=r) return t[v];
            ll mid = (tl+tr)/2;
            return mrg(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 = 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 = 0;i<=tsz;i++) for(ll j = 0;j<=tsz;j++) len[i][j] = 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;
                    }
                    ll f = 0;
                    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<cyc.size();e++){
                        while(f<ps.size()-1&&ps[f+1]-ps[e]<=cyclen/2) f++;
                        cur = max(cur,mx[cyc[e%(cyc.size())]][0] - ps[e] + get(1,0,m,e+1,f).fi);
                    }
                    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:120:70: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  120 |                     for(ll k = 1;k<=tsz;k++) vis[k] = inc[k] = id[k] = in[k] = out[k] = dept[k] = 0;
      |                                                                ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
shortcut.cpp:127:35: 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]
  127 |                     for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
      |                                  ~^~~~~~~~~~~
shortcut.cpp:130:35: 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]
  130 |                     for(ll k = 1;k<cyc.size();k++) ps.pb(ps.back() + len[cyc[k]][cyc[k-1]]);
      |                                  ~^~~~~~~~~~~
shortcut.cpp:133:35: 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 k = 0;k<cyc.size();k++){
      |                                  ~^~~~~~~~~~~
shortcut.cpp:143:35: 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]
  143 |                     for(ll k = 1;k<cyc.size();k++) ps.pb(ps[k-1] + len[cyc[k]][cyc[k-1]]);
      |                                  ~^~~~~~~~~~~
shortcut.cpp:146:35: 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]
  146 |                     for(ll k = 1;k<cyc.size();k++) ps.pb(ps.back() + len[cyc[k]][cyc[k-1]]);
      |                                  ~^~~~~~~~~~~
shortcut.cpp:149:35: 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]
  149 |                     for(ll e = 0;e<cyc.size();e++){
      |                                  ~^~~~~~~~~~~
shortcut.cpp:150:32: 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]
  150 |                         while(f<ps.size()-1&&ps[f+1]-ps[e]<=cyclen/2) f++;
      |                               ~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 468 KB n = 4, incorrect answer: jury 80 vs contestant 1000000000000000
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 468 KB n = 4, incorrect answer: jury 80 vs contestant 1000000000000000
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 468 KB n = 4, incorrect answer: jury 80 vs contestant 1000000000000000
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 468 KB n = 4, incorrect answer: jury 80 vs contestant 1000000000000000
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 468 KB n = 4, incorrect answer: jury 80 vs contestant 1000000000000000
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 468 KB n = 4, incorrect answer: jury 80 vs contestant 1000000000000000
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 468 KB n = 4, incorrect answer: jury 80 vs contestant 1000000000000000
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 468 KB n = 4, incorrect answer: jury 80 vs contestant 1000000000000000
2 Halted 0 ms 0 KB -