2023 rcpc

This commit is contained in:
2024-04-22 16:45:09 +03:00
parent a0ddb657b7
commit 156202ada0
61 changed files with 4462 additions and 0 deletions

View File

@@ -0,0 +1,122 @@
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
ifstream fin("brute.in");
ofstream fout("brute.out");
#else
#define fin cin
#define fout cout
#endif
void YN(bool cond) {
if(cond) {
fout << "YES\n";
} else {
fout << "NO\n";
}
}
const int kV = 1000;
const int kQ = 1e4;
const int kN = 1e4;
const int kS = 1000;
vector<int> depth, parent, weight;
vector<vector<int>> adj;
void dfs(int u = 0, int v = -1) {
for(const auto &it: adj[u]) if(it != v) {
depth[it] = depth[u] + 1;
parent[it] = u;
dfs(it, u);
}
}
bool check_greedy(const vector<int> &h, int hp) {
bitset<kS + 1> dp;
dp[0] = 1;
int mx = 0, frq = 1;
for(const auto &it: h) {
if(it > mx) {
mx = it;
frq = 1;
} else if(it == mx) {
frq++;
}
}
for(const auto &it: h) {
if(it != mx && it <= hp) {
dp |= dp << it;
}
}
for(int i = 0; i <= frq; i++) {
if(i * mx > hp) {
return 0;
}
int crt_hp = hp - i * mx, crt_frq = frq - i;
if(crt_frq & 1) {
if(crt_hp >= mx && dp[crt_hp - mx]) {
return 1;
}
} else {
if(dp[crt_hp]) {
return 1;
}
}
}
return 0;
}
int main() {
int n;
fin >> n;
adj = vector<vector<int>>(n);
weight = vector<int>(n);
for(auto &it: weight) {
fin >> it;
}
for(int i = 1; i < n; i++) {
int u, v;
fin >> u >> v;
u--; v--;
adj[u].emplace_back(v);
adj[v].emplace_back(u);
}
depth = vector<int>(n);
parent = vector<int>(n);
dfs();
int q;
fin >> q;
for(int i = 0; i < q; i++) {
int u, v, hp;
fin >> u >> v >> hp;
u--; v--;
vector<int> h;
if(depth[u] < depth[v]) {
swap(u, v);
}
while(depth[u] > depth[v]) {
h.emplace_back(weight[u]);
u = parent[u];
}
while(u != v) {
h.emplace_back(weight[u]);
h.emplace_back(weight[v]);
u = parent[u];
v = parent[v];
}
h.emplace_back(weight[u]);
bool ans = check_greedy(h, hp);
YN(ans);
}
return 0;
}