QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#213060 | #6438. Crystalfly | autumndream | WA | 89ms | 32356kb | C++14 | 3.3kb | 2023-10-14 10:41:21 | 2023-10-14 10:41:21 |
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;
// cerr <<"U "<<u<<endl;
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;
// cerr << "V "<<v << ' ' << dp3[v] - dp[v][0] + a[v]<< endl;
if(dp3[v] - dp[v][0] + a[v]> maxnn){
maxnn = dp3[v] - dp[v][0] + a[v];
maxi = v;
}
else if(dp3[v] - dp[v][0] + a[v]> 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){
// cerr<< "dp " << dp[i][0] << ' ' << dp[i][1] <<' '<< dp3[i]<< endl;
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: 100
Accepted
time: 0ms
memory: 32356kb
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 10111
result:
ok 2 number(s): "10101 10111"
Test #2:
score: 0
Accepted
time: 0ms
memory: 32312kb
input:
10 6 8 1 1 5 8 9 2 1 2 2 2 2 1 2 2 3 2 4 1 5 2 6 6 6 4 4 1 3 6 2 1 3 3 3 3 1 2 1 3 3 4 4 5 5 6 6 10 5 1 8 5 1 1 3 1 2 2 2 1 2 2 3 2 4 2 5 3 6 10 6 8 8 9 6 9 5 6 6 4 2 1 3 3 2 2 2 2 3 1 1 2 1 3 3 4 4 5 5 6 4 7 2 8 7 9 9 10 7 10 9 1 5 7 5 4 1 1 1 2 1 3 2 1 2 1 3 3 4 3 5 5 6 1 7 5 7 1 1 4 2 3 1 3 2 2 1...
output:
25 24 24 56 31 14 16 28 19 19
result:
ok 10 numbers
Test #3:
score: -100
Wrong Answer
time: 89ms
memory: 31328kb
input:
100000 10 9 1 7 9 5 1 10 5 3 8 2 1 1 3 1 2 2 3 3 1 1 2 2 3 3 4 1 5 2 6 2 7 6 8 7 9 7 10 3 6 6 1 2 1 2 1 2 1 3 10 6 5 3 7 1 5 1 9 7 3 3 1 3 3 1 3 2 2 2 3 1 2 1 3 3 4 4 5 2 6 6 7 4 8 7 9 1 10 7 2 8 9 7 7 9 10 2 3 2 2 3 2 1 1 2 2 3 1 4 3 5 4 6 3 7 1 8 1 1 4 2 7 9 9 9 8 4 2 7 3 1 2 1 1 1 1 1 2 2 3 2 4 3...
output:
49 12 41 45 8 4 38 22 20 21 5 19 23 44 26 5 21 28 28 32 36 15 4 26 38 33 20 35 27 36 20 9 32 32 22 11 41 15 20 54 38 20 45 36 20 29 24 4 37 44 30 45 17 17 36 29 3 6 24 44 25 28 50 13 5 1 44 27 17 21 15 17 17 24 29 35 10 39 38 26 22 24 9 17 41 7 28 33 51 18 14 14 7 35 23 13 11 43 28 24 35 2 43 33 17 ...
result:
wrong answer 23rd numbers differ - expected: '5', found: '4'