另一种贪心做法求调
查看原帖
另一种贪心做法求调
681036
OldDriverTree楼主2024/12/22 09:19

rt,提交记录

思路就是在 ci1c_i\le 1 时把背包直接改为贪心

//when you use vector or deque,pay attention to the size of it.
//by OldDirverTree
#include<bits/stdc++.h>
//#include<atcoder/all>
#define P pair<int,int>
#define int long long
#define mid (l+r>>1)
using namespace std;
//using namespace atcoder;
const int N=1e5+1;
int Yorushika[N];
int n,a[N],b[N],f[N],g[N];
vector<int> G[N];

struct custom_hash
{
	static uint64_t splitmix64(uint64_t x) {
		x+=0x9e3779b97f4a7c15;
		x=(x^(x>>30) )*0xbf58476d1ce4e5b9;
		x=(x^(x>>27) )*0x94d049bb133111eb;
		return x^(x>>31);
	}
	size_t operator() (uint64_t x) const {
		static const uint64_t FIXED_RANDOM=chrono::steady_clock::now().time_since_epoch().count();
		return splitmix64(x+FIXED_RANDOM);
	}
};
int read() {
	int x=0; bool f=true; char c=0;
	while (!isdigit(c) ) f&=(c!='-'),c=getchar();
	while (isdigit(c) ) x=(x<<3)+(x<<1)+(c&15),c=getchar();
	return f?x:-x;
}
void dfs(int u,int fa)
{
	int maxv=0,sum=0;
	for (int v:G[u]) if (v^fa) dfs(v,u),maxv=max(maxv,b[v]);
	f[u]=g[u]=1e9,Yorushika[0]=0;
	if (maxv>1)
	{
		for (int v:G[u]) if (v^fa) {
			for (int i=sum;~i;i--) Yorushika[i+b[v] ]=min(Yorushika[i+b[v] ]+f[v],Yorushika[i]+g[v]);
			for (int i=0;i<b[v];i++) Yorushika[i]+=f[v]; sum+=b[v];
		}
	}
	else
	{
		int now=0; vector<int> w;
		for (int v:G[u]) if (v^fa) {
			if (b[v]) now+=f[v],sum++,
			w.push_back(g[v]-f[v]); else now+=g[v];
		}
		Yorushika[0]=now;
		sort(w.begin(),w.end() );
		for (int i=0;i<w.size();i++)
		now+=w[i],Yorushika[i+1]=now;
	}
	for (int i=0;i<=sum;i++)
	f[u]=min(Yorushika[i]+max(a[u]-i-b[fa],0ll),f[u]),
	g[u]=min(Yorushika[i]+max(a[u]-i,0ll),g[u]),Yorushika[i]=1e9;
}
main()
{
	n=read();
	for (int i=1;i<=n;i++) a[i]=read();
	for (int i=1;i<=n;i++) b[i]=read();
	for (int i=1;i<n;i++) {
		int x=read(),y=read();
		G[x].push_back(y),G[y].push_back(x);
	}
	memset(Yorushika,0x3f,sizeof Yorushika);
	return dfs(1,0),!printf("%lld",f[1]);
}
2024/12/22 09:19
加载中...