제출 #44304

#제출 시각아이디문제언어결과실행 시간메모리
44304NnandiUzastopni (COCI15_uzastopni)C++14
160 / 160
58 ms17916 KiB
#include <bits/stdc++.h>
#define bound 28
using namespace std;

struct Mydata {
    int tab[4];
    Mydata() {
        for(int i=0;i<4;i++) tab[i]=0;
    }
    bool get_elem(int i) {
        int z=i/bound;
        i=i%bound;
        return ((tab[z]>>i)%2==1);
    }
    void set_elem(int i, bool b) {
        int z=i/bound;
        i=i%bound;
        int akt=tab[z];
        tab[z]=((akt>>(i+1))<<(i+1)) + ((b ? 1 :0)<<i) + ((akt)%(1<<i));
        return;
    }
};

const int maxn=10005;
const int maxv=105;
vector<int> graf[maxn];

Mydata dp[maxn][maxv];
int v[maxn];

void bejar(int start, int apa, set<int> &volt) {
    int ez=v[start];
    if(volt.count(ez)>0) {
        return;
    }
    volt.insert(ez);
    vector<int> dag[maxv];
    dag[ez].push_back(ez+1);
    for(int s:graf[start]) {
        bejar(s,start,volt);
        for(int i=0;i<maxv;i++) {
            for(int j=i+1;j<maxv;j++) {
                if(dp[s][i].get_elem(j)) {
                    dag[i].push_back(j);
                }
            }
        }
    }
    vector<int> sor;
    bool volte[maxv];

    for(int i=0;i<=ez;i++) {
        sor.resize(0);
        memset(volte,false,maxv);
        sor.push_back(i);
        int it=0;
        while(it<(int)(sor.size())) {
            int akt=sor[it]; it++;
            volte[akt]=true;
            for(int s:dag[akt]) {
                if(!volte[s]) {
                    volte[s]=true;
                    sor.push_back(s);
                }
            }
        }

        for(int d:sor) {
            if(d>ez) {
                dp[start][i].set_elem(d,true);
            }
        }
    }
    volt.erase(ez);
    return;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=0;i<n;i++) {
        cin>>v[i];
        v[i]--;
    }
    for(int i=0;i<n-1;i++) {
        int u, v;
        cin>>u>>v;
        u--; v--;
        graf[u].push_back(v);
    }
    set<int> s;
    s.clear();
    bejar(0,0,s);
    int sol=0;
    for(int i=0;i<=v[0];i++) {
        for(int j=v[0]+1;j<maxv;j++) {
            if(dp[0][i].get_elem(j)) {
                sol++;
            }
        }
    }
    cout<<sol<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...