Submission #98675

#TimeUsernameProblemLanguageResultExecution timeMemory
98675polyfishUzastopni (COCI15_uzastopni)C++14
120 / 160
1078 ms17988 KiB
//Pantyhose(black) + glasses = infinity

#include <bits/stdc++.h>
using namespace std;

#define debug(x) cerr << #x << " = " << x << '\n';
#define BP() cerr << "OK!\n";
#define PR(A, n) {cerr << #A << " = "; for (int _=1; _<=n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define PR0(A, n) {cerr << #A << " = "; for (int _=0; _<n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define FILE_NAME "data"

const int MAX_N = 10002;
const int MAX_V = 102;

int n, maxV, v[MAX_N], sz[MAX_N];
vector<int> g[MAX_N];
bitset<MAX_V> F[MAX_N][MAX_V], f[MAX_N][MAX_V];

void readInput() {
    cin >> n;

    for (int i=1; i<=n; ++i)
        cin >> v[i];

    g[1].push_back(0);

    for (int i=1; i<n; ++i) {
        int u, v;
        cin >> u >> v;

        g[u].push_back(v);
        g[v].push_back(u);
    }
}

int fixRoot(int u, int par) {
    sz[u] = 1;

    for (int i=0; i<g[u].size(); ++i) {
        int v = g[u][i];

        if (v!=par)
            sz[u] += fixRoot(v, u);
        else
            swap(g[u][0], g[u][i]);
    }

    return sz[u];
}

void dp(int u) {
    for (int i=1; i<g[u].size(); ++i)
        dp(g[u][i]);

    vector<int> p(1);
    p.push_back(u);

    for (int i=1; i<g[u].size(); ++i)
        p.push_back(g[u][i]);

    sort(p.begin(), p.end(), [](int x, int y) {
        return v[x] < v[y];
    });

    int cur = 1;

    for (int i=1; i<=maxV; ++i)
        f[0][i][0] = true;
    F[u][v[u]][1] = true;

    for (int i=0; i+1<p.size(); ++i) {
        int v = p[i+1];

        for (int l=1; l<=maxV; ++l) {
            for (int x=0; x<=min(cur, maxV-l+1); ++x) {
                for (int y=0; y<=(v!=u ? sz[v] : 1) && l+x+y-1<=maxV; ++y)
                    f[i+1][l][x+y] = false;
            }
        }

        for (int l=1; l<=maxV; ++l) {
            for (int x=0; x<=min(cur, maxV-l+1); ++x) {
                for (int y=0; y<=(v!=u ? sz[v] : 1) && l+x+y-1<=maxV; ++y)
                    f[i+1][l][x+y] = f[i+1][l][x+y] || (f[i][l][x] & F[v][l+x][y]);
            }
        }

        cur += (v!=u ? sz[v] : 1);
    }

    for (int l=1; l<=maxV; ++l) {
        for (int x=0; x<=min(cur, maxV-l+1); ++x) {
            F[u][l][x] = F[u][l][x] || f[p.size()-1][l][x];
        }
        F[u][l][0] = true;
    }
}

int main() {
	#ifdef GLASSES_GIRL
		freopen(FILE_NAME".in", "r", stdin);
		//freopen(FILE_NAME".out", "w", stdout);
	#endif
	ios::sync_with_stdio(0); cin.tie(0);
	readInput();
	fixRoot(1, 0);
    maxV = *max_element(v+1, v+n+1);
    //dp(3);
    dp(1);
    int res = 0;
    for (int i=1; i<=maxV; ++i) {
        for (int j=i; j<=maxV; ++j)
            res += F[1][i][j-i+1];
    }
    cout << res;
}

Compilation message (stderr)

uzastopni.cpp: In function 'int fixRoot(int, int)':
uzastopni.cpp:39:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0; i<g[u].size(); ++i) {
                   ~^~~~~~~~~~~~
uzastopni.cpp: In function 'void dp(int)':
uzastopni.cpp:52:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=1; i<g[u].size(); ++i)
                   ~^~~~~~~~~~~~
uzastopni.cpp:58:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=1; i<g[u].size(); ++i)
                   ~^~~~~~~~~~~~
uzastopni.cpp:71:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0; i+1<p.size(); ++i) {
                   ~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...