Submission #132343

#TimeUsernameProblemLanguageResultExecution timeMemory
132343dualityConstruction of Highway (JOI18_construction)C++11
16 / 100
2064 ms16188 KiB
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
typedef long long int LLI;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vpii;

int C[100000];
vi adjList[100000];
int parent[100000],order[100000];
int depth[100000];
int disc[100000],fin[100000],inv[100000],num = 0;
int doDFS(int u,int d) {
    int i;
    depth[u] = d,disc[u] = num++,inv[num-1] = u;
    for (i = 0; i < adjList[u].size(); i++) doDFS(adjList[u][i],d+1);
    fin[u] = num;
    return 0;
}
int good[100000],pref[100000];
int main() {
    int i;
    int N,A,B;
    scanf("%d",&N);
    for (i = 0; i < N; i++) scanf("%d",&C[i]);
    parent[0] = -1;
    for (i = 0; i < N-1; i++) {
        scanf("%d %d",&A,&B);
        A--,B--;
        adjList[A].pb(B),parent[B] = A;
        order[i] = B;
    }
    doDFS(0,0);

    int j,k;
    for (i = 0; i < N; i++) pref[i] = -1;
    for (i = 0; i < N-1; i++) {
        int u = order[i];
        vpii vv;
        while (u != 0) {
            int v = pref[parent[u]];
            if (v != -1) good[v] = 0;
            pref[parent[u]] = u,good[u] = 1;
            int w = parent[u];
            while (good[w]) w = parent[w];
            if (v != -1) C[v] = C[w];
            vv.pb(mp(C[w],depth[u]-depth[w]));
            u = w;
        }
        LLI ans = 0;
        reverse(vv.begin(),vv.end());
        for (j = 0; j < vv.size(); j++) {
            for (k = j+1; k < vv.size(); k++) {
                if (vv[j].first > vv[k].first) ans += (LLI) vv[j].second*vv[k].second;
            }
        }
        printf("%lld\n",ans);
        C[0] = C[order[i]];
    }

    return 0;
}

Compilation message (stderr)

construction.cpp: In function 'int doDFS(int, int)':
construction.cpp:18:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (i = 0; i < adjList[u].size(); i++) doDFS(adjList[u][i],d+1);
                 ~~^~~~~~~~~~~~~~~~~~~
construction.cpp: In function 'int main()':
construction.cpp:54:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (j = 0; j < vv.size(); j++) {
                     ~~^~~~~~~~~~~
construction.cpp:55:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (k = j+1; k < vv.size(); k++) {
                           ~~^~~~~~~~~~~
construction.cpp:26:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&N);
     ~~~~~^~~~~~~~~
construction.cpp:27:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for (i = 0; i < N; i++) scanf("%d",&C[i]);
                             ~~~~~^~~~~~~~~~~~
construction.cpp:30:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d",&A,&B);
         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...