답안 #356153

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
356153 2021-01-23T07:49:41 Z achibasadzishvili Islands (IOI08_islands) C++14
15 / 100
136 ms 131076 KB
#include<bits/stdc++.h>
#define ll long long
#define f first
#define s second
#define pb push_back
#define N 1000002
using namespace std;
ll n,p[N],l[N],fix[N],F[N],ans,pas,k,c[N],mx[N];
vector<ll>v[N];
map<ll,ll>M[N],ra[N];
vector<ll>g,all;
void dfs(ll x){
    if(F[x])return;
    all.pb(x);
    F[x] = 1;
    for(int i=0; i<v[x].size(); i++)
        dfs(v[x][i]);
}
void findc(ll x,ll par){
    if(fix[x]){
        g.pb(x);
        k = 1;
        return;
    }
    g.pb(x);
    fix[x] = 1;
    for(int i=0; i<v[x].size(); i++)
        if(v[x][i] != par || ra[x][v[x][i]] > 1){
            findc(v[x][i] , x);
            if(k)return;
        }
    g.pop_back();
}
void findmx(ll x,ll par){
    ll mx1 = 0,mx2 = 0;
    for(int i=0; i<v[x].size(); i++){
        if(v[x][i] != par && !c[v[x][i]]){
            findmx(v[x][i] , x);
            mx[x] = max(mx[x] , mx[v[x][i]] + M[x][v[x][i]]);
            if(mx[v[x][i]] + M[x][v[x][i]] > mx1){
                mx2 = mx1;
                mx1 = mx[v[x][i]] + M[x][v[x][i]];
            }
            else if(mx[v[x][i]] + M[x][v[x][i]] > mx2)
                    mx2 = mx[v[x][i]] + M[x][v[x][i]];
        }
    }
    ans = max(ans , mx1 + mx2);
}
int main(){
    ios::sync_with_stdio(false);
    cin >> n;
    
    for(int i=1; i<=n; i++){
        cin >> p[i] >> l[i];
        M[i][p[i]] = max(M[i][p[i]] , l[i]);
        M[p[i]][i] = max(M[p[i]][i] , l[i]);
        ra[i][p[i]]++;
        ra[p[i]][i]++;
        v[p[i]].pb(i);
        v[i].pb(p[i]);
    }
    
    for(int s=1; s<=n; s++){
        if(F[s])continue;
        ans = 0;
        k = 0;
        all.clear();
        dfs(s);
        g.clear();
        findc(s , 0);
        vector<int>cyc;
        for(int i=0; i<g.size(); i++){
            if(g[i] == g[(int)g.size() - 1]){
                for(int j=i+1; j<g.size(); j++){
                    cyc.pb(g[j]);
                    c[g[j]] = 1;
                }
                break;
            }
        }
        for(int i=0; i<cyc.size(); i++){
            findmx(cyc[i] , 0);
        }
        ll cur = mx[cyc[0]];
        ll pre = 0;
        for(int i=1; i<cyc.size(); i++){
            pre += M[cyc[i]][cyc[i - 1]];
            ans = max(ans , cur + mx[cyc[i]] + pre);
            cur = max(cur , mx[cyc[i]] - pre);
        }
        if(cyc.size() > 1)
            reverse(cyc.begin() + 1,cyc.end());
        cur = mx[cyc[0]];
        pre = 0;
        for(int i=1; i<cyc.size(); i++){
            pre += M[cyc[i]][cyc[i - 1]];
            ans = max(ans , cur + mx[cyc[i]] + pre);
            cur = max(cur , mx[cyc[i]] - pre);
        }
        pas += ans;
    }
    
    cout << pas << '\n';
    
    return 0;
}

Compilation message

islands.cpp: In function 'void dfs(long long int)':
islands.cpp:16:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |     for(int i=0; i<v[x].size(); i++)
      |                  ~^~~~~~~~~~~~
islands.cpp: In function 'void findc(long long int, long long int)':
islands.cpp:27:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |     for(int i=0; i<v[x].size(); i++)
      |                  ~^~~~~~~~~~~~
islands.cpp: In function 'void findmx(long long int, long long int)':
islands.cpp:36:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     for(int i=0; i<v[x].size(); i++){
      |                  ~^~~~~~~~~~~~
islands.cpp: In function 'int main()':
islands.cpp:73:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |         for(int i=0; i<g.size(); i++){
      |                      ~^~~~~~~~~
islands.cpp:75:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   75 |                 for(int j=i+1; j<g.size(); j++){
      |                                ~^~~~~~~~~
islands.cpp:82:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |         for(int i=0; i<cyc.size(); i++){
      |                      ~^~~~~~~~~~~
islands.cpp:87:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |         for(int i=1; i<cyc.size(); i++){
      |                      ~^~~~~~~~~~~
islands.cpp:96:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |         for(int i=1; i<cyc.size(); i++){
      |                      ~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 79 ms 117740 KB Output isn't correct
2 Correct 79 ms 117868 KB Output is correct
3 Incorrect 78 ms 117996 KB Output isn't correct
4 Correct 79 ms 117868 KB Output is correct
5 Correct 91 ms 117868 KB Output is correct
6 Incorrect 85 ms 117868 KB Output isn't correct
7 Incorrect 79 ms 117868 KB Output isn't correct
8 Incorrect 80 ms 117868 KB Output isn't correct
9 Incorrect 78 ms 117868 KB Output isn't correct
10 Correct 81 ms 117868 KB Output is correct
11 Correct 84 ms 117868 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 89 ms 118152 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 83 ms 118476 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 115 ms 123360 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 136 ms 131076 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 114 ms 131072 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 105 ms 131076 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 121 ms 131076 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 128 ms 131076 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -