답안 #341434

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
341434 2020-12-29T16:56:08 Z beksultan04 관광지 (IZhO14_shymbulak) C++14
50 / 100
1500 ms 59552 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define OK puts("OK");
#define NO puts("NO");
#define YES puts("YES");
#define fr first
#define sc second
#define ret return
#define scanl(a) scanf("%lld",&a);
#define scanll(a,b) scanf("%lld %lld",&a, &b);
#define scanlll(a,b,c) scanf("%lld %lld %lld",&a,&b,&c);
#define scan1(a) scanf("%d",&a);
#define scan2(a,b) scanf("%d %d",&a, &b);
#define scan3(a,b,c) scanf("%d %d %d",&a,&b,&c);
#define all(s) s.begin(),s.end()
#define allr(s) s.rbegin(),s.rend()
#define pb push_back
#define sz(v) (int)v.size()
#define endi puts("");
#define eps 1e-12
const int N = 2e6+12,INF=1e9+7;

vector <int> g[N],cycle,v;
pii ver[N];
bool bosh[N],vis[N];
void dfs_cycle(int x,int p){
    vis[x] = 1;
    int i,j;
    v.pb(x);
    for (i=0;i<g[x].size();++i){
        int to = g[x][i];
        if (vis[to] == 1 && to != p){
            bool f=0;
            for (j=0;j<v.size();++j){
                if (v[j] == to)f=1;
                if (f){
                    cycle.pb(v[j]);
                }

            }
        }
        if (vis[to] == 0){
            dfs_cycle(to,x);
        }
    }
    v.pop_back();
}


int dlina[N],colichestvo[N];

int ans,cont;
void dfs_diametr(int x,int p){
    int i;
    vector <pii> tmp;
    for (i=0;i<g[x].size();++i){
        if (g[x][i] == p || bosh[g[x][i]])continue;
        dfs_diametr(g[x][i],x);
        tmp.pb({dlina[g[x][i]],colichestvo[g[x][i]]});
    }
    if (tmp.size() == 0){
        colichestvo[x] = 1;
        ret;
    }
    sort(allr(tmp));
    int mx = tmp[0].fr,cnt = tmp[0].sc;
    for (i=1;i<tmp.size();++i){
        if (tmp[i].fr == mx){
            cnt += tmp[i].sc;
        }

    }
    dlina[x] = mx+1;
    colichestvo[x] = cnt;
}

void calc(int x,int y,int m){
    int dist = min(abs(x-y),m-abs(x-y));
    dist += dlina[cycle[x]];
    dist += dlina[cycle[y]];
    if (ans < dist){
        ans = dist;
        cont=0;
    }
    if (dist == ans){
        if (abs(x-y) == (m-abs(x-y))){
            cont += max(colichestvo[cycle[x]],1ll)*max(1ll,colichestvo[cycle[y]])*2ll;
        }
        else
            cont += colichestvo[cycle[x]]*colichestvo[cycle[y]]*1ll;
    }
}

void posledniy_dfs(int x,int p){
    vector <pii> tmp;
    int i;
    for (i=0;i<g[x].size();++i){
        if (g[x][i] == p || bosh[g[x][i]])continue;
        posledniy_dfs(g[x][i],x);
        tmp.pb({dlina[g[x][i]],colichestvo[g[x][i]]});
    }
    if (tmp.size() <2)ret;
    sort(allr(tmp));
    if (tmp.empty())ret;
    vector <int> xixi;
    int mx = tmp[0].fr+1,cnt=tmp[0].sc,f=0;
    if (mx == tmp[1].fr+1){
        xixi.pb(cnt);
        int sum=0,bla=0;
        for (i=1;i<tmp.size();++i){
            if (tmp[i].fr+1+mx > ans){
                ans = tmp[i].fr+1+mx;
                f=2;
            }
            if (ans == tmp[i].fr+1+mx){
                xixi.pb(tmp[i].sc);
                f = max(f,1ll);
            }
            else break;
        }
        for (i=0;i<xixi.size();++i){
            sum+=xixi[i];
            bla += xixi[i]*xixi[i];
        }
        sum *= sum;
        sum-=bla;
        sum/=2;
        if (f==2)cont=sum;
        else if (f==1){
            cont+=sum;
        }
    }
    else {
        int sum=0,bla=0;

        for (i=1;i<tmp.size();++i){
            if (tmp[i].fr+1+mx > ans){
                ans = tmp[i].fr+1+mx;
                f=2;
            }
            if (ans == tmp[i].fr+1+mx){
                xixi.pb(tmp[i].sc);
                sum += cnt*tmp[i].sc;
                f = max(f,1ll);
            }
            else break;
        }
        if (f==2)cont=sum;
        else if (f==1){
            cont+=sum;
        }

    }
}

main(){

    int n,i,j;
    cin>>n;
    for (i=1;i<=n;++i){
        int x,y;
        cin>>x>>y;
        g[x].pb(y);
        g[y].pb(x);
    }
    dfs_cycle(1,0);
    int m = cycle.size();
    if (m == n){
        cout <<n;
        ret 0;
    }
    for (i=0;i<m;++i)
        bosh[cycle[i]] = 1;
    for (i=0;i<m;++i){
        dfs_diametr(cycle[i],0);
//        cout <<cycle[i]<<"-"<<dlina[cycle[i]]<<" ";
//        cout <<colichestvo[cycle[i]]<<"\n";
    }
    for (i=0;i<m;++i){
        for (j=i+1;j<m;++j){
            calc(i,j,m);
        }
    }
    for (i=0;i<m;++i){
        posledniy_dfs(cycle[i],0);
    }
    cout <<cont;

}
/*
16
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
6 10
10 11
10 12
5 13
2 14
2 15
15 16
7 1


10
1 2
2 3
3 4
4 7
3 5
3 8
5 6
8 9
9 10
3 1
*/

Compilation message

shymbulak.cpp: In function 'void dfs_cycle(long long int, long long int)':
shymbulak.cpp:32:15: 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]
   32 |     for (i=0;i<g[x].size();++i){
      |              ~^~~~~~~~~~~~
shymbulak.cpp:36:23: 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]
   36 |             for (j=0;j<v.size();++j){
      |                      ~^~~~~~~~~
shymbulak.cpp: In function 'void dfs_diametr(long long int, long long int)':
shymbulak.cpp:58:15: 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]
   58 |     for (i=0;i<g[x].size();++i){
      |              ~^~~~~~~~~~~~
shymbulak.cpp:69:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |     for (i=1;i<tmp.size();++i){
      |              ~^~~~~~~~~~~
shymbulak.cpp: In function 'void posledniy_dfs(long long int, long long int)':
shymbulak.cpp:99:15: 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]
   99 |     for (i=0;i<g[x].size();++i){
      |              ~^~~~~~~~~~~~
shymbulak.cpp:112:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |         for (i=1;i<tmp.size();++i){
      |                  ~^~~~~~~~~~~
shymbulak.cpp:123:19: 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 (i=0;i<xixi.size();++i){
      |                  ~^~~~~~~~~~~~
shymbulak.cpp:138:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |         for (i=1;i<tmp.size();++i){
      |                  ~^~~~~~~~~~~
shymbulak.cpp:136:19: warning: unused variable 'bla' [-Wunused-variable]
  136 |         int sum=0,bla=0;
      |                   ^~~
shymbulak.cpp: At global scope:
shymbulak.cpp:158:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  158 | main(){
      |      ^
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 47340 KB Output is correct
2 Correct 30 ms 47340 KB Output is correct
3 Correct 31 ms 47340 KB Output is correct
4 Correct 32 ms 47340 KB Output is correct
5 Correct 30 ms 47340 KB Output is correct
6 Correct 30 ms 47360 KB Output is correct
7 Correct 31 ms 47340 KB Output is correct
8 Correct 30 ms 47340 KB Output is correct
9 Correct 30 ms 47340 KB Output is correct
10 Correct 30 ms 47340 KB Output is correct
11 Correct 30 ms 47340 KB Output is correct
12 Correct 30 ms 47340 KB Output is correct
13 Correct 30 ms 47340 KB Output is correct
14 Correct 30 ms 47340 KB Output is correct
15 Correct 30 ms 47340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 47468 KB Output is correct
2 Correct 27 ms 47340 KB Output is correct
3 Correct 31 ms 47488 KB Output is correct
4 Correct 35 ms 47356 KB Output is correct
5 Correct 35 ms 47596 KB Output is correct
6 Correct 34 ms 47852 KB Output is correct
7 Correct 35 ms 47724 KB Output is correct
8 Correct 37 ms 47596 KB Output is correct
9 Correct 35 ms 47596 KB Output is correct
10 Correct 35 ms 47596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 171 ms 53504 KB Output is correct
2 Correct 178 ms 53356 KB Output is correct
3 Execution timed out 1590 ms 59552 KB Time limit exceeded
4 Halted 0 ms 0 KB -