#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f, N = 100010;
int n, m, xx, yy, aa, bb, lca;
LL val[N], f0[N], f1[N], nf0[N], nf1[N], vis[N],
fa[N], dep[N], g0[N], g1[N], path[N];
char type[5];
vector<int> e[N];
queue<int> q;
LL init_dfs(int u, int father){
for(int i = 0; i < e[u].size(); i++){
int v = e[u][i];
if(v == father){ fa[u] = v; continue; }
f1[u] += init_dfs(v, u);
f0[u] += f1[v];
}
f1[u] += val[u];
return min(f0[u], f1[u]);
}
void bfs(){
dep[1] = 1;
nf1[1] = val[1];
q.push(1); vis[1] = 1;
while(q.size()){
int u = q.front(); q.pop();
for(int i = 0; i < e[u].size(); i++){
int v = e[u][i];
if(vis[v]) continue;
nf0[v] = nf1[u] + f1[u] - val[u] - min(f0[v], f1[v]);
nf1[v] = min(nf1[u] + f1[u]- val[u] - min(f0[v], f1[v]),
nf0[u] + f0[u] - f1[v]) + val[v];
q.push(v); vis[v] = 1; dep[v] = dep[u] + 1;
}
}
return;
}
/*int find_lca(int a, int b){
int x = a, y = b;
path[x] = 1, path[y] = 1;
if(dep[x] < dep[y]) swap(x, y);
while(dep[x] > dep[y]) x = fa[x], path[x] = 1;
while(x != y) x = fa[x], y = fa[y], path[x] = 1, path[y] = 1;
return x;
}*/
int dfs(int u){
if(!path[u]){
g0[u] = f0[u], g1[u] = f1[u];
return min(g0[u], g1[u]);
}
if(u == aa && u != lca){
if(xx) return g1[u] = f1[u];
else { g1[u] = INF; return g0[u] = f0[u]; }
}
if(u == bb && u != lca){
if(yy) return g1[u] = f1[u];
else { g1[u] = INF; return g0[u] = f0[u]; }
}
for(int i = 0; i < e[u].size(); i++){
int v = e[u][i];
if(v == fa[u]) continue;
g1[u] += dfs(v);
g0[u] += g1[v];
}
g1[u] += val[u];
return min(g0[u], g1[u]);
}
int main(){
cin >> n >> m;
cin >> type;
for(int i = 1; i <= n; i++) cin >> val[i];
for(int i = 1; i < n; i++){
int x, y; cin >> x >> y;
e[x].push_back(y), e[y].push_back(x);
}
init_dfs(1, 0);
bfs();
for(int i = 1; i <= m; i++){
memset(g0, 0, sizeof(g0));
memset(g1, 0, sizeof(g1));
memset(path, 0, sizeof(path));
cin >> aa >> xx >> bb >> yy;
//lca = find_lca(aa, bb);
dfs(lca);
if((lca == aa && !xx) || (lca == bb && !yy)) g1[lca] = INF;
if((lca == aa && xx) || (lca == bb && yy)) g0[lca] = INF;
int ans = min(nf0[lca] + g0[lca], nf1[lca] + g1[lca] - val[lca]);
if(ans >= INF) cout << -1 << endl;
else cout << ans << endl;
}
return 0;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 990.54 us | 4 MB + 664 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #2 | 999.66 us | 4 MB + 664 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #3 | 993.53 us | 4 MB + 664 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #4 | 991.78 us | 4 MB + 664 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #5 | 5.44 ms | 4 MB + 672 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #6 | 5.436 ms | 4 MB + 672 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #7 | 5.436 ms | 4 MB + 664 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #8 | 99.153 ms | 4 MB + 1000 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #9 | 99.166 ms | 4 MB + 1000 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #10 | 99.101 ms | 4 MB + 912 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #11 | 99.074 ms | 4 MB + 912 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #12 | 2 s | 21 MB + 492 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #13 | 2 s | 21 MB + 492 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #14 | 2 s | 21 MB + 492 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #15 | 2 s | 21 MB + 492 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #16 | 2 s | 21 MB + 492 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #17 | 2 s | 21 MB + 492 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #18 | 2 s | 14 MB + 64 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #19 | 2 s | 14 MB + 68 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #20 | 2 s | 17 MB + 304 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #21 | 2 s | 17 MB + 304 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #22 | 2 s | 17 MB + 304 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #23 | 2 s | 17 MB + 300 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #24 | 2 s | 17 MB + 304 KB | Time Limit Exceeded | Score: 0 | 显示更多 |
| Testcase #25 | 2 s | 17 MB + 316 KB | Time Limit Exceeded | Score: 0 | 显示更多 |