QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#213053 | #6438. Crystalfly | autumndream | WA | 8ms | 31284kb | C++14 | 3.3kb | 2023-10-14 10:28:09 | 2023-10-14 10:28:10 |
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 = 1; i <= n; ++i){
// cerr << fa[i] << endl;
// }
for(int i = 2; i <= n; ++i){
if(img[i].size() == 1){
dp[i][1] = a[i];
dp3[i] = 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];
}
//cerr <<"U "<<u<<endl;
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] << endl;
if(dp3[v] - dp[v][0] > maxnn){
maxnn = dp3[v] - dp[v][0];
maxi = v;
}
else if(dp3[v] - dp[v][0] > maxs){
maxs = dp3[v] - dp[v][0];
}
}
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];
dp3[u] = dp[u][0];
}
}
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;
}
詳細信息
Test #1:
score: 100
Accepted
time: 8ms
memory: 31284kb
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: -100
Wrong Answer
time: 6ms
memory: 30728kb
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 54 31 14 16 28 19 19
result:
wrong answer 4th numbers differ - expected: '56', found: '54'