답안 #91802

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
91802 2018-12-30T05:00:18 Z easrui Islands (IOI08_islands) C++14
64 / 100
968 ms 132096 KB
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6+5;
struct Edge{
    int i,x;
    long long d;
    Edge(){};
    Edge(int a, int b, long long c){i=a;x=b;d=c;};
};

int N;
long long D[MAX],Ans;
bool vE[MAX],vN[MAX],isL[MAX];
vector<Edge> I[MAX];
stack<int> L;
vector<int> Lp;
vector<long long> A,B,C,dis;

void DFS(int i)
{
    if(vN[i]){
        Lp.push_back(i);
        isL[i] = true;
        while(L.top()!=i){
            Lp.push_back(L.top());
            isL[L.top()] = true;
            L.pop();
        }
        return;
    }
    vN[i] = true;
    L.push(i);
    for(auto it : I[i]){
        if(vE[it.i]) continue;
        vE[it.i] = true;
        DFS(it.x);
    }
    if(!L.empty()) L.pop();
}

long long getD(int i, int x, long long d, int r)
{
    long long res=d;
    if(isL[x]) return 0;
    for(auto it : I[x]){
        if(it.x==r) continue;
        res = max(res,getD(i,it.x,it.d+d,x));
    }
    return res;
}

long long getL()
{
    long long res=0,tmp,subm;
    int n = Lp.size();
    for(int i=0; i<n; i++)
        for(auto it : I[Lp[i]]){
            if(it.x==Lp[(i+1)%n]) dis.push_back(it.d);
            tmp = getD(Lp[i],it.x,it.d,Lp[i]);
            if(D[Lp[i]]<=tmp){
                subm=D[Lp[i]];
                D[Lp[i]]=tmp;
                res = max(res,D[Lp[i]]+subm);
            }
        }
    A.push_back(D[Lp[0]]);
    //cout << D[Lp[0]] << D[Lp[1]] << D[Lp[2]];
    for(int i=1; i<n; i++) A.push_back(A[i-1]+D[Lp[i]]-D[Lp[i-1]]+dis[i-1]);
    for(int i=0; i<n; i++) B.push_back(A[i]-D[Lp[i]]*2);
    C.push_back(D[Lp[n-1]]+dis[n-1]);
    for(int i=1; i<n-1; i++) C.push_back(C[i-1]+D[Lp[n-1-i]]-D[Lp[n-i]]+dis[n-1-i]);
    tmp = B[0];
    res = A[1] - B[0];
    for(int i=2; i<Lp.size(); i++){
        tmp = min(tmp,B[i-1]);
        res = max(res,A[i] - tmp);
    }
    tmp = A[0];
    res = max(res,C[n-2] + A[0]);
    //cout << res;
    for(int i=n-3; i>=0; i--){
        tmp = max(tmp,A[n-2-i]);
        res = max(res,C[i] + tmp);
    }
    //cout << C[0];
    return res;
}

int main()
{
    cin >> N;
    for(int i=1; i<=N; i++){
        int x;
        long long d;
        cin >> x >> d;
        I[i].push_back(Edge(i,x,d));
        I[x].push_back(Edge(i,i,d));
    }
    for(int j=1; j<=N; j++){
        if(vN[j]) continue;
        Lp.clear();
        A.clear();
        B.clear();
        C.clear();
        dis.clear();
        DFS(j);
        Ans += getL();
        //cout << Ans;
    }
    cout << Ans;
}


/*7
3 8
7 2
4 2
1 4
1 9
3 4
2 3*/

Compilation message

islands.cpp: In function 'long long int getL()':
islands.cpp:74:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=2; i<Lp.size(); i++){
                  ~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 23800 KB Output is correct
2 Incorrect 22 ms 23800 KB Output isn't correct
3 Correct 23 ms 23804 KB Output is correct
4 Correct 19 ms 23800 KB Output is correct
5 Correct 24 ms 23800 KB Output is correct
6 Correct 23 ms 23800 KB Output is correct
7 Correct 23 ms 23800 KB Output is correct
8 Correct 23 ms 23800 KB Output is correct
9 Correct 22 ms 23800 KB Output is correct
10 Incorrect 23 ms 23800 KB Output isn't correct
11 Correct 22 ms 23800 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 23928 KB Output is correct
2 Correct 26 ms 23932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 23928 KB Output is correct
2 Correct 27 ms 24312 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 25120 KB Output is correct
2 Correct 58 ms 27512 KB Output is correct
3 Correct 46 ms 25208 KB Output is correct
4 Incorrect 33 ms 24588 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 80 ms 28900 KB Output is correct
2 Correct 114 ms 31852 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 203 ms 38136 KB Output is correct
2 Correct 210 ms 43888 KB Output is correct
3 Correct 290 ms 54528 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 363 ms 49956 KB Output is correct
2 Correct 449 ms 74068 KB Output is correct
3 Correct 474 ms 81836 KB Output is correct
4 Correct 621 ms 100996 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 850 ms 72756 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 968 ms 132096 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -