zoukankan      html  css  js  c++  java
  • 吴楚月的表达式 题解(思维)

    题目链接

    题目思路

    本以为要用什么前缀表达式啥的

    看了下题解,其实只需要维护一个非空表达式前缀可以表示成 a+b的形式。

    若后面接了+x 则\(a+b=(a+b)+x\)

    若后面接了-x 则\(a+b=(a+b)+(-x)\)

    若后面接了*x 则\(a+b=a+bx\)

    若后面接了/x 则\(a+b=a+bx^{mod-2}\)

    则依然可以变为a+b的表达式

    但是要注意维护一个a+b的正负号

    代码

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define debug cout<<"I AM HERE"<<endl;
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
    const double eps=1e-3;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    int n;
    int v[maxn];
    int fa[maxn];
    int head[maxn],cnt;
    ll ans[maxn];
    struct edge{
        int to,nxt;
        char opt;
    }e[maxn];
    void add(int u,int v,char ch){
        e[++cnt]={v,head[u],ch};
        head[u]=cnt;
    }
    ll qpow(ll a,ll b){
        ll ans=1,base=a;
        while(b){
            if(b&1){
                ans=ans*base%mod;
            }
            b=b>>1;
            base=base*base%mod;
        }
        return ans;
    }
    inline ll cal(ll x){
        return (x%mod+mod)%mod;
    }
    void dfs(int id,ll a,ll b,int x){
        ans[id]=cal(a+b*x);
        for(int i=head[id];i;i=e[i].nxt){
            if(e[i].opt=='+'){
                dfs(e[i].to,cal(a+b*x),v[e[i].to],1);
            }else if(e[i].opt=='-'){
                dfs(e[i].to,cal(a+b*x),v[e[i].to],-1);
            }else if(e[i].opt=='*'){
                dfs(e[i].to,a,cal(b*v[e[i].to]),x);
            }else{
                dfs(e[i].to,a,cal(b*qpow(v[e[i].to],mod-2)),x);
            }
        }
    }
    signed main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&v[i]);
        }
        for(int i=2;i<=n;i++){
            scanf("%d",&fa[i]);
        }
        for(int i=2;i<=n;i++){
            char ch;
            scanf(" %c",&ch);
            add(fa[i],i,ch);
        }
        dfs(1,0,v[1],1);
        for(int i=1;i<=n;i++){
            printf("%lld ",ans[i]);
        }
        return 0;
    }
    
    
    不摆烂了,写题
  • 相关阅读:
    java-线程
    List、Map、set的加载因子,默认初始容量和扩容增量
    Mybatis使用generator自动生成映射配置文件信息
    Fiddler手机https抓包
    通知消息与ON_NOTIFY
    ATL实现COM组件
    vs参数配置
    QToolBox
    CTreeCtrl控件
    SQL-INSERT INTO用法
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/14425901.html
Copyright © 2011-2022 走看看