2021牛客寒假算法基础集训营4 H 边化成运算符 计算每个节点到根节点的表达式值 DFS 待定形参

题目

在这里插入图片描述

题解思路

一开始想着先dfs一遍处理乘法除法的值。
第二次dfs的时候标记特判。
Wa了。
其实不用这么麻烦,我们只需从头扫到根节点,将有潜力变成乘法或者除法里的数分开进行。
当运算到加减法的时候可以将之前的有潜力的就一定不可能再变成乘除法了,将加减的数变成新的有潜力的数。
乘除法类似。

除法记得逆元

这样属实巧妙。

还是说我写太少树的题了。
还是太菜了。

AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long

using namespace std;

const  int  INF =  0x3f3f3f3f ;
const  int mod = 1e9 + 7 ;
const  int N = 100010 ; 

long long  a[N] ; 
long long ans[N] ; 

vector <int> head[N] ; 
char fh[N] ; 
int n ; 
int falg = 0 ; 
long long qsm(long long a, long long b)
{
    long long ans = 1, t = a;
    while(b)
    {
        if (b & 1) ans = ans *t % mod;
        t = t * t % mod;
        b >>= 1;
    }
    return ans % mod;
}
long long ni(long long x )
{
    return qsm(x,mod-2) ; 
}

void dfs(int p , long long t1 , long long t2  )
{
    ans[p] = (t1 + t2 )%mod ;
    for (int i = 0 ; i < head[p].size() ; i++ )
    {
        int sp = head[p][i] ; 
        if ( fh[sp] == '+')
        {
            dfs(sp,(t1+t2+mod)%mod,a[sp]);
        }else if (fh[sp] == '-' )
            dfs(sp,(t1+t2+mod)%mod,(-a[sp]+mod)%mod);
        else if ( fh[sp] == '*' )
        {
            dfs(sp,t1,t2*a[sp]%mod);
        }else
            dfs(sp,t1,t2*ni(a[sp])%mod);
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin >> n ;
    for (int i = 1 ; i <= n ; i++ )
        cin >> a[i] ;
    for (int i = 1 ; i < n  ; i++ )
    {
        int t1 ; 
        cin >> t1 ;
        head[t1].push_back(i+1);
    }
    cin >> fh+2 ; 
    dfs(1,0,a[1]);
    for (int i = 1 ; i <= n ; i++ )
        cout << ans[i] << " " ; 
    cout << "\n" ; 
    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值