题意:给你n种材料,第i种材料初始有bi个,然后给你n-1个转换关系,对于第i行,表示可以用ki个第xi种材料换取1个第i种材料,并且1个第i种材料可以换取1个第xi种材料,然后问你能否使得最后第i种材料至少为ai个?
题解:最暴力的方法就是倒着来,利用转化关系每种材料让他刚好就是ai个,如果不能满足,则后边的都让他不满足就好了
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 100005
#define inf (1e18+5)
vector<pair<ll,ll> >q[maxn];
ll n,x,k,a[maxn],b[maxn],dp[maxn];
void dfs(int u)
{
dp[u]=b[u]-a[u];
for(int i=0;i<q[u].size();i++)
{
int v=q[u][i].first;
int val=q[u][i].second;
dfs(v);
if(dp[v]<0)
{
if(dp[v]*(-1)<inf/val)
dp[u]+=dp[v]*val;
else
dp[u]=-inf;
if(dp[u]<-inf)
dp[u]=-inf;
}
else
dp[u]+=dp[v];
}
}
int main(void)
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&b[i]);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(ll i=2;i<=n;i++)
{
scanf("%lld%lld",&x,&k);
q[x].push_back(make_pair(i,k));
}
dfs(1);
if(dp[1]>=0)
printf("YES\n");
else
printf("NO\n");
return 0;
}