NC218421 吴楚月的表达式(dfs)
朴素的做法是把全部的存起来,之后用正常的表达式计算做
据说这种方法容易mle
新的方法是,我们把这个式子当作两个式子相加,因为他没有括号,所以每次的优先级都是相同的
因此我们根据四种情况分类讨论即可
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const int N=1e5+10; const int inf=0x3f3f3f3f; const int mod=1e9+7; ll w[N]; int f[N]; ll ans[N]; struct node{ int x; char op; }; vector<node> g[N]; ll qmi(ll a,ll b){ ll res=1; while(b){ if(b&1){ res=res*a%mod; } a=a*a%mod; b>>=1; } return res; } void dfs(int u,int fa,ll a,ll b){ int i; for(i=0;i<(int)g[u].size();i++){ int j=g[u][i].x; if(j==fa) continue; if(g[u][i].op=='+'){ dfs(j,u,(a+b)%mod,w[j]); } if(g[u][i].op=='-'){ dfs(j,u,(a+b)%mod,(-w[j]+mod)%mod); } if(g[u][i].op=='*'){ dfs(j,u,a,b*w[j]%mod); } if(g[u][i].op=='/'){ dfs(j,u,a,b*qmi(w[j],mod-2)%mod); } } ans[u]=(a+b)%mod; } int main(){ ios::sync_with_stdio(false); int n; cin>>n; int i; for(i=1;i<=n;i++) cin>>w[i]; for(i=2;i<=n;i++){ cin>>f[i]; } for(i=2;i<=n;i++){ char opt; cin>>opt; g[i].push_back({f[i],opt}); g[f[i]].push_back({i,opt}); } dfs(1,0,0,w[1]); for(i=1;i<=n;i++){ cout<<ans[i]<<" "; } cout<<endl; return 0; }
没有人不辛苦,只有人不喊疼