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;
}
View Code
没有人不辛苦,只有人不喊疼
原文地址:https://www.cnblogs.com/ctyakwf/p/14432939.html