我在这道题里打了一段代码然后WA了每次分还不一样(20-90)
然后我把C++14换成了C++11,C++20,C++98发现都能A
代码(没啥可读性
#include<bits/stdc++.h>
using namespace std;
namespace Generate{
long long n,seed;
static const long long mod=1e9;
long long Rand(long long x){
seed=(1ll*seed*0x66CCF+19260817ll)%x+1;
seed=(1ll*seed*0x77CCF+20060428ll)%x+1;
seed=(1ll*seed*0x88CCF+12345678ll)%x+1;
seed=(1ll*seed*0x33CCCCFF+10086001ll)%x+1;
return seed;
}
void RS(long long* a, long long* u, long long* v){ //你需要传入三个参数,分别表示点权,一条边的两个端点
long long cnt=0;
for(long long i=1;i<=n;i++)a[i]=Rand(mod);
for(long long i=2;i<=n;i++){
long long fa=Rand(i-1);
cnt++;
u[cnt]=fa,v[cnt]=i;
}
}
};
inline long long read(){
long long f=1,x=0;char ch;
while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-')f=-1;};
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();};
return f*x;
}
long long ans,opt,n,a[0x66ccff],U[0x66ccff],V[0x66ccff];
vector<long long>LuoShuiTianYi[0x66ccff];
long long dfs(long long u,long long fa) {
long long GuangYuYingDeDuiBai=0,WanFenZhiYiDeGuang=0;
for (long long i=0;i<LuoShuiTianYi[u].size();i++) {
long long v=LuoShuiTianYi[u][i];
if(v==fa)
continue;
long long YiHuaYiShiJie=dfs(v,u);
GuangYuYingDeDuiBai+=YiHuaYiShiJie,
WanFenZhiYiDeGuang=max(WanFenZhiYiDeGuang,YiHuaYiShiJie);
}
long long c=min(GuangYuYingDeDuiBai/2,GuangYuYingDeDuiBai-WanFenZhiYiDeGuang);
long long YueHuaWu=max(0ll,min(c,min(a[u],GuangYuYingDeDuiBai-a[u])));
ans+=max(0ll,a[u]-GuangYuYingDeDuiBai+YueHuaWu)-YueHuaWu;
return a[u]-YueHuaWu;
}
int main() {
opt=read();
if(opt==1){
n=read();
for(long long i=1;i<=n;i++)
a[i]=read();
for(long long i=1;i<n;i++) {
long long
u=read(),
v=read();
LuoShuiTianYi[u].push_back(v);
LuoShuiTianYi[v].push_back(u);
}
}
else{
Generate::seed=read(),
n=read();
Generate::n=n;
Generate::RS(a,U, V);
for(long long i=1;i<n;i++) {
LuoShuiTianYi[U[i]].push_back(V[i]);
LuoShuiTianYi[V[i]].push_back(U[i]);
}
}
dfs(1,0);
cout<<ans<<"\n";
}