제출 #1369601

#제출 시각아이디문제언어결과실행 시간메모리
1369601pcheloveksCollecting Stamps 5 (JOI26_stamps)C++20
41 / 100
683 ms18540 KiB
#define _CRT_SECURE_NO_WARNINGS
 
#include <bits/stdc++.h>
 
#define endl '\n'
 
//#pragma GCC optimize("Ofast")
 
using namespace std;
 
using ll = long long;
using ld = long double;
using pii = pair < int, int >;
using pll = pair < ll, ll >;
 
const ll INF = 2e18;
const ll DIM = 400007;
const ll DIMQ = 2007;
const ld PI = 3.1415926535;
const int mod = 998244353;

struct fenwickTree {
public:

    void init(int sz) {
        this->sz = sz;
        T.resize(sz + 1, 0); 
    }

    void add(int pos, int val) {
        pos++;
        for(int i = pos; i <= sz; i += i & -i) T[i] += val;
    }

    int sum(int pos) {
        pos++;
        int res = 0;
        for(int i = pos; i > 0; i -= i & -i) res += T[i];
        return res;
    }

private:

    int sz;
    vector < int > T;
};

int n, d;
vector < int > v[DIM];

int T[DIM];
int sz[DIM];
int dep[DIM];
int res[DIM];
bool used[DIM];

void sizes(int val, int prev) {
    sz[val] = 1;
    for(auto to: v[val]) {
        if(to == prev || used[to]) continue;
        sizes(to, val);
        sz[val] += sz[to];
    }
}

int centroid(int val, int prev, int tsz) {
    for(auto to: v[val]) {
        if(to == prev || used[to]) continue;

        if(sz[to] > tsz / 2) return centroid(to, val, tsz);
    }
    return val;
}

fenwickTree t;

void dfs1(int val, int prev, int mi, int sign) {
    mi = min(mi, T[val] - dep[val]);
    t.add(max(mi, 0), sign);

    for(auto to: v[val]) {
        if(to == prev || used[to]) continue;

        dep[to] = dep[val] + 1;
        dfs1(to, val, mi, sign);
    }
}

int cnt = 0;
void dfs2(int val, int prev, int root, int x, int compSz) {

    if(dep[val] >= T[val]) cnt++;

    x = min(x, T[val] + dep[val]);

    if(cnt > 0) {
        res[root]++;
    }

    if(val != root) {
        if(dep[val] >= x) {
            res[val] += compSz;
        }
        else {
            res[val] += t.sum(dep[val]);
        }
    }

    for(auto to: v[val]) {
        if(to == prev || used[to]) continue;

        dfs2(to, val, root, x, compSz);
    }

    if(dep[val] >= T[val]) cnt--;
}

void solve(int val) {

    sizes(val, val);        
    dep[val] = 0;

    t.add(T[val], 1);

    for(auto to: v[val]) {
        if(used[to]) continue;

        dep[to] = 1;

        dfs1(to, val, T[val], 1);
    }

    cnt = 0;
    if(T[val] == 0) {
        cnt = 1;
        res[val]++;
    }

    for(auto to: v[val]) {
        if(used[to]) continue;

        dfs1(to, val, T[val], -1);
        dfs2(to, val, val, T[val] + dep[val], sz[val] - sz[to]);
        dfs1(to, val, T[val], 1);
    }

    for(auto to: v[val]) {
        if(used[to]) continue;;
        dfs1(to, val, T[val], -1);
    }

    cnt = 0;

    t.add(T[val], -1);

    used[val] = true;
    for(auto to: v[val]) {
        if(used[to]) continue;

        sizes(to, val);
        solve(centroid(to, val, sz[to]));
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
#ifdef IloveCP
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif  

    cin >> n >> d;

    for(int i = 1; i <= n; i++) cin >> T[i];
    for(int i = 1; i < n; i++) {
        int v1, v2;
        cin >> v1 >> v2;

        v[v1].push_back(v2);
        v[v2].push_back(v1);
    }

    t.init(DIM + 7);
    for(int i = 1; i <= n; i++) res[i] = 0;

    sizes(1, 1);
    solve(centroid(1, 1, n));

    for(int i = 1; i <= n; i++) cout << res[i] << endl;

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…