首页 > 其他分享 >函数调用

函数调用

时间:2023-10-09 14:01:07浏览次数:47  
标签:调用 int sum cin 函数调用 mul mod

P7077 [CSP-S2020] 函数调用

我们考虑如果没有第三种函数,如何解决这个问题。

发现,对于每个1(1类),我们考虑在它之后执行了多少个2,然后累乘,就是这个增加操作实际的贡献。我们只需要倒序,维护一个后缀积即可。

我们的核心思想就是计算每个1的贡献是几倍。

考虑有3会怎么样。还是延续上面的思路。有3,那么可以递归调用,我们记 \(mul_i\) 表示执行这个函数后,整个序列会而且恰好是DAG,我们发现母结点的乘积恰好等于自己的乘积 \(\times\) 所有后继乘积,可以用拓扑排序的逆序求解。

然后我们就要求解每个函数会被调用的次数了。我们发现母结点被调用一次,那么子节点就会相对应的调用多次(每次当母结点被调用一次,子节点调用次数是一样的)。我们先倒着求出所有第一层的函数调用的次数(即没有操作3的情况)。对于不在第一层的点,我们发现它的调用次数首先有一个基数 \(sum_{fa}\),然后对于它所有的兄弟节点,需要乘上在它之后的 \(mul_{brother}\)。这个处理是拓扑排序的正序。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
typedef long long ll;

const int N=100010,M=1000010,mod=998244353;
int n,w[N],m,d[N],q[N],g[N];
int h[N],e[M],ne[M],idx;//don't forget memset h!
void add(int a,int b){
    ++d[b],e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

struct Func{
    int t,p,v,mul,sum;
}f[N];
void topo(){
    int hh=0,tt=-1;
    E(i, m)
        if(!d[i])q[++tt]=i;
    Wh(hh<=tt){
        int x=q[hh++];
        Ed{
            int j=e[i];
            if(--d[j]==0)q[++tt]=j;
        }
    }
}
void calc_mul(){
    Re(i, m-1, 0){
        int x=q[i];
        Ed{
            int j=e[i];
            f[x].mul=1ll*f[x].mul*f[j].mul%mod;
        }
    }
}
void calc_sum(){
    L(i, m){
        int x=q[i];
        ll sum=f[x].sum;
        Ed{
            int j=e[i];
            f[j].sum=(f[j].sum+sum)%mod;
            sum=sum*f[j].mul%mod;
        }
    }
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    E(i, n)cin>>w[i];
    cin>>m;
    memset(h,-1,m*4+4);
    E(i, m){
        cin>>f[i].t;
        if(f[i].t==1)cin>>f[i].p>>f[i].v;
        else if(f[i].t==2)cin>>f[i].mul;
        else{
            int c;
            cin>>c;
            W(c){
                int x;
                cin>>x;
                add(i,x);
            }
        }
    }
    topo();
    E(i, m)
        if(f[i].t!=2)f[i].mul=1;
    calc_mul();
    int q;
    cin>>q;
    ll mul=1;
    E(i, q)cin>>g[i];
    Re(i, q, 1){
        int x=g[i];
        f[x].sum=(f[x].sum+mul)%mod;
        mul=mul*f[x].mul%mod;
    }
    calc_sum();
    E(i, n)w[i]=w[i]*mul%mod;
    E(i, m)
        if(f[i].t==1)w[f[i].p]=(w[f[i].p]+1ll*f[i].sum*f[i].v%mod)%mod;
    E(i, n)cout<<w[i]<<' ';
    return 0;
}

标签:调用,int,sum,cin,函数调用,mul,mod
From: https://www.cnblogs.com/wscqwq/p/17751563.html

相关文章

  • Shell 函数详解(函数定义、函数调用、参数变量)
    Shell函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。Shell中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。Shell函数定义的语法格式如下:functionname(){statements[re......
  • ElPlus - color-picker 暴露的 show 函数调用时面板开启又关闭问题
    问题描述ElPlus2.3.3版本之后给我们提供了两个expose函数,show和hide,到目前版本2.3.14为止在调用show函数时会遇到一个问题:调用之后color-picker组件显示了但是很快又会被关闭掉。cover:(https://element-plus.org/images/element-plus-logo.svg)title:(ColorPicke......
  • Golang 初识: 函数调用与定义丶字符串处理丶Json的处理
    一.基本函数调用与定义1packagemain23import(4"encoding/json"5"errors"6"fmt"7"math/rand"8"mylib/pkg/student"9"mylib/pkg/utils"10"sort"11......
  • js ast 函数调用替换为值
    目标替换ob文件中形如_0x55f3('0x19',"Pg54")的代码为具体的值。consttypes=require("@babel/types");conststr_to_str={ StringLiteral(path){ const{node}=path; node.extra=null; }}var_0x4818=["wqImMT0tw6RNw5k=&quo......
  • golang 协程、延迟函数调用、以及恐慌和恢复
    此篇文章将介绍协程和延迟函数调用。协程和延迟函数调用是Go中比较独特的两个特性。恐慌和恢复也将在此篇文章中得到简单介绍。本文并非全面地对这些特性进行介绍,后面的其它文章会陆续补全本文的未介绍的内容。协程(goroutine)现代CPU一般含有多个核,并且一个核可能支持多线程。......
  • 【题解】 P7077 [CSP-S2020] 函数调用(拓扑排序)
    题意题目给定了一个长度为\(n\)序列\(a\)与\(m\)个操作,操作一共有3种:1.给定\(x,y\),使\(a_x\)增加\(y\)。2.给定\(x\),使\(a\)中所有数全部乘上\(x\)。3.给出k个数\(c_1,c_2,...,c_k\),表示这个操作的任务是按照先后顺序执行编号为\(c_1,c_2,...,c_k\)的\(k\)的操作。最后,题目相......
  • 5.5 汇编语言:函数调用约定
    函数是任何一门高级语言中必须要存在的,使用函数式编程可以让程序可读性更高,充分发挥了模块化设计思想的精髓,今天我将带大家一起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进行实现的,并使用汇编语言模拟实现函数编程中的参数传递调用规范等。说到函数我们必须要提......
  • 5.5 汇编语言:函数调用约定
    函数是任何一门高级语言中必须要存在的,使用函数式编程可以让程序可读性更高,充分发挥了模块化设计思想的精髓,今天我将带大家一起来探索函数的实现机理,探索编译器到底是如何对函数这个关键字进行实现的,并使用汇编语言模拟实现函数编程中的参数传递调用规范等。说到函数我们必须要提......
  • "静态方法和实例方法" 这两种函数调用的区别
    来看两段代码第一段:publicclassRegexDemo{publicstaticvoidmain(String[]args){func();}privatestaticvoidfunc(){Stringinput="123456";booleanmatches=input.matches("\\d+");Syste......
  • 基于GPT搭建私有知识库聊天机器人(五)函数调用
    文章链接:基于GPT搭建私有知识库聊天机器人(一)实现原理基于GPT搭建私有知识库聊天机器人(二)环境安装基于GPT搭建私有知识库聊天机器人(三)向量数据训练基于GPT搭建私有知识库聊天机器人(四)问答实现OpenAI在6月13日发布了几个重磅更新,其中包括:开放了16k上下文的GPT-3.5-Turbo模型gpt-3.5-t......