# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
95779 | JustInCase | Uzastopni (COCI15_uzastopni) | C++17 | 112 ms | 33792 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
const int32_t MAX_N = 10000;
const int32_t MAX_K = 100;
class Tree {
private:
struct Node {
bool isVisited;
int32_t id, joke;
std::vector< Node* > v;
std::vector< std::pair< int32_t, int32_t > > dp;
std::bitset< MAX_K + 5 > intervals[MAX_K + 5];
};
public:
int32_t cntNodes;
Node nodes[MAX_N + 5];
void Init(int32_t pCntNodes = 0) {
cntNodes = pCntNodes;
for(int32_t i = 1; i <= cntNodes; i++) {
nodes[i].id = i;
}
}
void AddEdge(Node *x, Node *y) {
x->v.push_back(y);
y->v.push_back(x);
}
void CalcDp(Node *nd) {
nd->isVisited = true;
std::vector< int32_t > q[MAX_K + 5];
for(auto &x : nd->v) {
if(!x->isVisited) {
CalcDp(x);
for(auto &i : x->dp) {
q[i.first].push_back(i.second);
}
}
}
for(int32_t i = MAX_K; i >= 1; i--) {
if(i == nd->joke) {
nd->intervals[i] |= nd->intervals[i + 1];
nd->intervals[i].set(i);
}
else {
for(auto &x : q[i]) {
if(x < nd->joke || i > nd->joke) {
nd->intervals[i] |= nd->intervals[x + 1];
nd->intervals[i].set(x);
}
}
}
for(int32_t j = MAX_K; j >= i; j--) {
if(nd->intervals[i].test(j)) {
if(nd->joke >= i && nd->joke <= j) {
nd->dp.push_back({ i, j });
}
}
}
}
}
};
Tree t;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int32_t n;
std::cin >> n;
t.Init(n);
for(int32_t i = 1; i <= n; i++) {
std::cin >> t.nodes[i].joke;
}
for(int32_t i = 0; i < n - 1; i++) {
int32_t x, y;
std::cin >> x >> y;
t.AddEdge(&t.nodes[x], &t.nodes[y]);
}
t.CalcDp(&t.nodes[1]);
std::cout << t.nodes[1].dp.size() << '\n';
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |