제출 #223642

#제출 시각아이디문제언어결과실행 시간메모리
223642kingfran1907Zagrade (COI17_zagrade)C++14
100 / 100
1808 ms46584 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long llint;

const int maxn = 3e5+10;

int n;
int niz[maxn];
vector< int > graph[maxn];
bool bio[maxn];
int cnt[maxn];

pair<int, int> fin(int x, int parr, int siz) {
    bool flag = true;
    int ac = 1;
    int cen = -1;

    int suma = siz - 1;
    for (int i = 0; i < graph[x].size(); i++) {
        int tren = graph[x][i];
        if (tren == parr) continue;
        if (bio[tren]) continue;

        pair<int, int> t = fin(tren, x, siz);
        ac += t.second;
        suma -= t.second;
        if (t.second > siz / 2) flag = false;
        cen = max(cen, t.first);
    }
    if (flag && suma <= siz / 2) cen = x;
    return make_pair(cen, ac);
}

int cn(int x, int parr) {
    int out = 1;
    for (int i = 0; i < graph[x].size(); i++) {
        int tren = graph[x][i];
        if (bio[tren]) continue;
        if (tren == parr) continue;

        out += cn(tren, x);
    }
    return out;
}

llint las(int x, int parr, int sum, int mini) {
    llint out = 0;
    sum += niz[x];
    mini = min(mini, sum);
    if (sum <= mini && sum <= 0) out += cnt[-sum];
    //printf("las %d %d %d %d\n", x, parr, sum, mini);

    for (int i = 0; i < graph[x].size(); i++) {
        int tren = graph[x][i];
        if (tren == parr) continue;
        if (bio[tren]) continue;

        out += las(tren, x, sum, mini);
    }
    return out;
}

void fron(int x, int parr, int sum, int mini) {
    sum += niz[x];
    mini = min(niz[x], mini + niz[x]);
    if (mini >= 0) cnt[sum]++;
    //printf("fron %d %d %d %d\n", x, parr, sum, mini);

    for (int i = 0; i < graph[x].size(); i++) {
        int tren = graph[x][i];
        if (tren == parr) continue;
        if (bio[tren]) continue;

        //printf("conn: %d %d\n", x, tren);
        fron(tren, x, sum, mini);
    }
    //printf("ret fron %d %d\n", x, parr);
}

void fron2(int x, int parr, int sum, int mini) {
    sum += niz[x];
    mini = min(niz[x], mini + niz[x]);
    if (mini >= 0) cnt[sum]--;
    //printf("fron %d %d %d %d\n", x, parr, sum, mini);

    for (int i = 0; i < graph[x].size(); i++) {
        int tren = graph[x][i];
        if (tren == parr) continue;
        if (bio[tren]) continue;

        //printf("conn: %d %d\n", x, tren);
        fron2(tren, x, sum, mini);
    }
    //printf("ret fron %d %d\n", x, parr);
}

llint f(int x, int siz) {
    //printf("fin %d %d\n", x, siz);
    int cen = fin(x, -1, siz).first;
    llint out = 0;

    //printf("fin start cal (cen = %d)\n", cen);
    //memset(cnt, 0, sizeof cnt);
    //if (niz[cen] == 1) cnt[1] = 1;
    cnt[0]++;
    for (int i = 0; i < graph[cen].size(); i++) {
        int tren = graph[cen][i];
        if (bio[tren]) continue;

        out += las(tren, cen, niz[cen], niz[cen]);
        fron(tren, cen, 0, 0);
    }
    if (niz[cen] == -1) out += cnt[1];

    for (int i = 0; i < graph[cen].size(); i++) {
        int tren = graph[cen][i];
        if (bio[tren]) continue;

        fron2(tren, cen, 0, 0);
    }
    cnt[0]--;

    //memset(cnt, 0, sizeof cnt);
    for (int i = graph[cen].size() - 1; i >= 0; i--) {
        int tren = graph[cen][i];
        if (bio[tren]) continue;

        out += las(tren, cen, niz[cen], niz[cen]);
        fron(tren, cen, 0, 0);
    }

    for (int i = 0; i < graph[cen].size(); i++) {
        int tren = graph[cen][i];
        if (bio[tren]) continue;

        fron2(tren, cen, 0, 0);
    }

    bio[cen] = true;
    for (int i = 0; i < graph[cen].size(); i++) {
        int tren = graph[cen][i];
        if (bio[tren]) continue;

        int si = cn(tren, -1);
        out += f(tren, si);
    }
    return out;
}

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        char c;
        scanf(" %c", &c);

        if (c == '(') niz[i] = 1;
        else niz[i] = -1;
    }

    for (int i = 1; i < n; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        graph[a].push_back(b);
        graph[b].push_back(a);
    }

    memset(bio, false, sizeof bio);
    printf("%lld\n", f(1, n));
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

zagrade.cpp: In function 'std::pair<int, int> fin(int, int, int)':
zagrade.cpp:20:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[x].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~
zagrade.cpp: In function 'int cn(int, int)':
zagrade.cpp:37:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[x].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~
zagrade.cpp: In function 'llint las(int, int, int, int)':
zagrade.cpp:54:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[x].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~
zagrade.cpp: In function 'void fron(int, int, int, int)':
zagrade.cpp:70:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[x].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~
zagrade.cpp: In function 'void fron2(int, int, int, int)':
zagrade.cpp:87:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[x].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~
zagrade.cpp: In function 'llint f(int, int)':
zagrade.cpp:107:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[cen].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~~~
zagrade.cpp:116:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[cen].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~~~
zagrade.cpp:133:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[cen].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~~~
zagrade.cpp:141:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < graph[cen].size(); i++) {
                     ~~^~~~~~~~~~~~~~~~~~~
zagrade.cpp: In function 'int main()':
zagrade.cpp:152:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
zagrade.cpp:155:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %c", &c);
         ~~~~~^~~~~~~~~~~
zagrade.cpp:163: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...