QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#213055 | #6438. Crystalfly | autumndream | WA | 0ms | 31508kb | C++14 | 3.1kb | 2023-10-14 10:32:01 | 2023-10-14 10:32:01 |
Judging History
answer
#include<algorithm>
#include<array>
#include<bitset>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<numeric>
#include<queue>
#include<set>
#include<unordered_map>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define endl '\n'
using namespace std;
using ll=long long;
using db=double;
using pii=pair<int,int>;
const int inf=0x3f3f3f3f;
const int mod=998244353;
const int N=4e5+10,M=1e3+10;
vector<int> img[N], dep[N];
ll a[N];
int t[N], fa[N], depth[N];
ll dp[N][2],dp3[N];
int maxn = 1;
void dfs(int x){
maxn = max(depth[x], maxn);
for(int i = 0; i < img[x].size(); ++i){
int v = img[x][i];
if(fa[v])continue;
fa[v] = x;
depth[v] = depth[x] + 1;
dep[depth[v]].pb(v);
dfs(v);
}
}
void solve()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++i){
cin >> a[i];
}
for(int i = 1; i <= n; ++i){
cin >> t[i];
}
if(n == 1){
cout << a[1] << endl;
return;
}
int u, v;
for(int i = 1; i < n; ++i){
cin >> u >> v;
img[u].pb(v);
img[v].pb(u);
}
fa[1] = 1;
depth[1] = 1;
dep[1].push_back(1);
dfs(1);
fa[1] = 0;
for(int i = 2; i <= n; ++i){
if(img[i].size() == 1){
dp[i][1] = a[i];
}
}
for(int k = maxn - 1; k > 0; --k){
for(int j = 0; j < dep[k].size(); ++j){
int u = dep[k][j];
if(img[u].size() == 1 && u != 1)continue;
priority_queue<pair<ll,int> > san;
ll maxnn = 0,maxi = 0,maxs = 0;
for(int i = 0; i < img[u].size(); ++i){
int v = img[u][i];
if(v == fa[u])continue;
dp3[u] += dp[v][0];
}
for(int i = 0; i < img[u].size(); ++i){
int v = img[u][i];
if(v == fa[u])continue;
if(dp3[v] - dp[v][0] > maxnn){
maxnn = dp3[v] - dp[v][0] + a[v];
maxi = v;
}
else if(dp3[v] - dp[v][0] > maxs){
maxs = dp3[v] - dp[v][0] + a[v];
}
}
for(int i = 0; i < img[u].size(); ++i){
int v = img[u][i];
if(v == fa[u])continue;
if(t[v] == 3){
if(maxi != v){
dp[u][1] = max(dp3[u] - dp[v][0] + dp[v][1] + maxnn + a[u], dp[u][1]);
}
else {
dp[u][1] = max(dp3[u] - dp[v][0] + dp[v][1] + maxs + a[u], dp[u][1]);
}
}
else dp[u][1] = max(dp3[u] - dp[v][0] + dp[v][1] + a[u],dp[u][1]);
}
dp[u][0] = dp[u][1] - a[u];
}
}
cout << dp[1][1] << endl;
for(int i = 1; i <= n; ++i){
dp[i][1] = 0;
dp[i][0] = 0;
dp3[i] = 0;
fa[i] = 0;
img[i].clear();
}
for(int i = 1; i <= maxn; ++i)dep[i].clear();
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while(t--)
solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 31508kb
input:
2 5 1 10 100 1000 10000 1 2 1 1 1 1 2 1 3 2 4 2 5 5 1 10 100 1000 10000 1 3 1 1 1 1 2 1 3 2 4 2 5
output:
10101 10101
result:
wrong answer 2nd numbers differ - expected: '10111', found: '10101'