P9847 求条
  • 板块灌水区
  • 楼主Guoguo2013
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/20 22:03
  • 上次更新2024/12/21 10:04:00
查看原帖
P9847 求条
1070982
Guoguo2013楼主2024/12/20 22:03

https://www.luogu.com.cn/problem/P9847

#include<bits/stdc++.h>
#define int long long
#define PII pair< int, int >

using namespace std;

const int N = 2e5 + 5, mod = 998244353;
int T, n, h[N], e[N], ne[N], idx = 1, a[N], t[N], dp[N][2];

template< typename T >inline void read(T &x){bool f=1;x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=!f;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}x=(f?x:-x);return;}
template< typename T, typename ... L > void read(T &a , L && ... b) { read(a); read(b ...); }
int ksm(int a, int b, int p){int ans = 1;while(b){if(b & 1)ans =(ans*a)%p;b >>= 1;a = (a*a) % p;}return ans;}
void add(int u, int v){
	e[idx] = v;
	ne[idx] = h[u];
	h[u] = idx++;
}
void dfs(int u, int fa){
	int m1 = -1, m2 = -1, p1 = -1, p2 = -1, pp = -1, mm = -1;
	for (int i = h[u]; ~i; i = ne[i]){
		int v = e[i];
		if (v == fa) continue;
		dfs(v, u);
		dp[u][0] += dp[v][1]; 
		if (t[v] == 3){
			if (a[v] > m1){
				m2 = m1;
				p2 = p1;
				m1 = a[v];
				p1 = v;
			}
			if (a[v] > m2){
				m2 = a[v];
				p2 = v;
			}
		}
		if (a[v] > mm){
			mm = a[v];
			pp = v;
		}
	}
	dp[u][1] = max(dp[u][1], dp[u][0] + mm);
	for (int i = h[u]; ~i; i = ne[i]){
		int v = e[i];
		if (v == fa) continue;
		if (v == p1) dp[u][1] = max(dp[u][1], dp[u][0] - dp[v][1] + m2 + a[v]);
		else dp[u][1] = max(dp[u][1], dp[u][0] - dp[v][1] + m1 + a[v]);
	}
//	if (pp == p1) dp[u][1] = max(dp[u][1], dp[u][0] - dp[pp][1] + m2 + mm);
//	else dp[u][1] = max(dp[u][1], dp[u][0] - dp[pp][1] + m1 + mm);
//	printf("%lld %lld %lld\n", u, dp[u][0], dp[u][1]);
}
void solve(){
	read(n);
	for (int i = 1; i <= n; i++) read(a[i]);
	for (int i = 1; i <= n; i++) read(t[i]);
	for (int i = 0; i <= n; i++) h[i] = -1;
	for (int i = 0; i <= n; i++) dp[i][0] = dp[i][1] = 0;
	for (int i = 1; i < n; i++){
		int u, v;
		read(u, v);
		add(u, v);
		add(v, u);
	}
	dfs(1, 0);
	printf("%lld\n", dp[1][1] + a[1]);
}
signed main(){
//	freopen("a.in", "r", stdin);
//	freopen("a.out","w",stdout);
	read(T);
	while (T--) solve();
	return 0;
}

服了,老是 12 分,讨论里面的那个也看不懂

2024/12/20 22:03
加载中...