zoukankan      html  css  js  c++  java
  • 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
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    [BZOJ3694]最短路
    [Usaco2011 Jan]道路和航线
    洛谷P1443马的遍历
    洛谷P1636学画画
    洛谷P1605走迷宫
    队列&广搜
    数论卷积公式and莫比乌斯反演
    数学之判断素数
    纯数学篇之欧拉定理证明
    筛素数
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14432939.html
Copyright © 2011-2022 走看看