CSP-S T3函数调用
函数是各种编程语言中一项重要的概念,借助函数,我们总可以将复杂的任务分解成一个个相对简单的子任务,直到细化为十分简单的基础操作,从而使代码的组织更加严密、更加有条理。然而,过多的函数调用也会导致额外的开销,影响程序的运行效率。
某数据库应用程序提供了若干函数用以维护数据。已知这些函数的功能可分为三类:
- 将数据中的指定元素加上一个值;
- 将数据中的每一个元素乘以一个相同值;
- 依次执行若干次函数调用,保证不会出现递归(即不会直接或间接地调用本身)。
在使用该数据库应用时,用户可一次性输入要调用的函数序列(一个函数可能被调用多次),在依次执行完序列中的函数后,系统中的数据被加以更新。某一天,小 A 在应用该数据库程序处理数据时遇到了困难:由于频繁而低效的函数调用,系统在执行操作时进入了无响应的状态,他只好强制结束了数据库程序。为了计算出正确数据,小 A 查阅了软件的文档,了解到每个函数的具体功能信息,现在他想请你根据这些信息帮他计算出更新后的数据应该是多少。
输入格式
第一行一个正整数 n,表示数据的个数。
第二行 n个整数,第 i个整数表示下标为 i的数据的初始值为 ai。
第三行一个正整数 m,表示数据库应用程序提供的函数个数。函数从 1∼m编号。
接下来 m行中,第 j(1≤j≤m)行的第一个整数为 Tj,表示 j号函数的类型:
- 若 Tj=1,接下来两个整数 Pj,Vj分别表示要执行加法的元素的下标及其增加的值;
- 若 Tj=2,接下来一个整数 Vj 表示所有元素所乘的值;
- 若 Tj=3,接下来一个正整数 Cj表示 j号函数要调用的函数个数,
随后 Cj个整数 g1(j),g2(j),…,gCj(j)依次表示其所调用的函数的编号。
第 m+4 行一个正整数 Q,表示输入的函数操作序列长度。
第 m+5行 QQ 个整数 fi,第 i个整数表示第 i个执行的函数的编号。
输出格式
一行 n个用空格隔开的整数,按照下标 1∼n的顺序,分别输出在执行完输入的函数序列后,数据库中每一个元素的值。答案对 998244353 取模。

题解:
这个题,研究之后发现真的是好题;
首先题目中的调用关系提示我们应该是个有向图,同时,函数不会直接或者间接的调用自己,所以不会出现环的情况
有向图上的算法有哪些呢?拓扑排序,最后的q次调用函数,也可以写成等同于m次操作,只是他为0号,会调用q次函数,所以以0号为超级原点,建立有向图即可
题目中提示了,如果只有操作1或者只有操作2怎么办?
如果只有乘法操作,哎呀,爽歪歪,直接拓扑排序,记录最终0号节点被乘了多少次x就行了,最终序列中所有的值直接乘以x即可
如果只有加法操作呢?暂时不会
加法操作和乘法操作混在一起的时候,就比较难计算,因为加法操作会被乘法操作影响,但是,我们考虑,加法操作会被哪些乘法影响呢?他只会被自己后面进行的乘法影响,所以对于每一个加,我们是否可以计算出这个加法操作被乘法执行了多少次,执行了多少次就是加法的倍数,最后我们用被加数*倍数就可以得到加的值是多少,以下图举例:

例如图中的+3操作,会被后面的*5影响,同时也会被3操作影响,当我们第一遍拓扑排序的时候,已经把每个节点的乘处理出来了,现在我们考虑怎么把+3被执行了多少次?
+3会被自己子树内的后面的乘法影响,同时还会被父亲节点后面的乘法节点影响,怎么计算呢?计cnt[v]表示v这个加法后面有多少乘法?如何递推呢?cnt[v]=cnt[v]+cnt[u]*cm,cm表示子树内目前被执行了多少次,cnt[u]表示父亲后面有多少乘法,cnt[u]*cm表示目前有多少乘法。当然,cnt[0]=1,这一点千万别忘了,如果这个值为0的话,只能计算子树内的贡献了
问题一:在做的过程中,有一个问题值得注意,既然0号节点连接其他节点,那么我们直接把0号节点放入队列中即可,为什么还需要枚举0-m呢?
因为在建图的过程中,有些节点虽然没有被0号节点调用,但是可能和最终节点连接,如果我们只把0号节点push进队列中,那么子节点有可能不能变成入度为0的点,就会有错误,换句话说,因为我们在建图的过程中,把所有点都放在图中了,但是在最终调用的时候却没有把某些点放在图中拓扑,所以会出现错误。
问题二;把没有被0号节点调用的点放入第二次拓扑中,会不会对答案产生影响呢?如下图

答案是不会,因为虽然乘法上会产生影响,但是我们只设定了cnt[0]=1,其他入度为0的点cnt[]的值均为0,所以根本更新不到子树
CSP-S T3函数调用的更多相关文章
- 「考试」CSP-S 2020
乱扯 爆炸的过程是这样的 写了\(2.5h\)的\(T1\)过不去大样例,自闭了 决定调\(T2\)然后过了样例但事实上写的完全是假的 这个时候突然\(T1\)灵光一闪就没再看\(T2\)了 然后就一 ...
- @CSP模拟2019.10.16 - T3@ 垃圾分类
目录 @description@ @solution@ @accepted code@ @details@ @description@ 为了保护环境,p6pou建设了一个垃圾分类器. 垃圾分类器是一个 ...
- 2019.10.28 CSP%您赛第四场t3
我写不动前两个了. 原谅一下. ____________________________________________________________________________________ ...
- HeRaNO's NOIP CSP Round Day 2 T3 ginkgo
睡醒后我第一眼:这不主席树裸题吗? 先统计dfs序,把树上问题转化为区间问题 区间大于等于某个数的个数...主席树模板? #include<bits/stdc++.h> #define r ...
- 2020 CSP&NOIP 游记
CSP初赛 CSP初赛 Day -1 早上打了模拟赛,T2寒假正好做过,然而还是还是被踩Orz,郑外NB!.中午出校吃了大盘鸡和拉面,还带回来了三瓶可乐. 初赛知识点看了两页不(看)想(不)看(懂)了 ...
- 关于C#基类和子类函数调用问题
c#基类子类的函数调用关系,代码说明newkeyword后面的类中的函数为对象调用的函数,当然必需要有virtual和override,继承就相当于包括了基类的函数,子类对象调用时基类的函数相当于就在 ...
- CSP应用开发-CryptAPI函数库介绍
基本加密函数为开发加密应用程序提供了足够灵活的空间.所有CSP的通讯都是通过这些函数.一个CSP是实现所有加密操作的独立模块.在每一个应用程序中至少需要提供一个CSP来完成所需的加密操作.如果使用多于 ...
- CSP学习之CryptoAPI初识
Crypto API目的就是提供开发者在windows下使用PKI的编程接口. Crypto 提供了很多的加解密相关函数,如编码.解码.加密解密,哈希,数字证书.证书管理证书存储等. 有关 ...
- Python 函数调用性能记录
之前用 JS 写项目的时候,项目组用的组件模式,一直感觉很不错.最近用 Python 做新项目,项目结构也延续了组件模式.一直没有对函数调用的性能作了解,今天突发奇想测试了一下,写了一些测试代码 首先 ...
- 基于 CSP 的设计思想和 OOP 设计思想的异同
LinkerLin Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视.标准库的很多设计保留了很浓的OOP的味道.本篇Blog想比较下从设计的角度看,CSP和OO ...
随机推荐
- IP地址后面/24/26/27/28/29/30网关数量分别是多少?如何计算?
转载csdn: https://blog.csdn.net/jinfengyunIDC/article/details/112575286
- 在windows环境中如何批量添加IP地址 and 求助 : 在CMD命令行中配置IP地址, 提示 : 未能配置DHCP服务, 接口可能已经断开, 系统找不到指定的文件.
转载csdn: 在windows环境中如何批量添加IP地址_user_yuewu的博客-CSDN博客_windows批量添加ip 求助 : 在CMD命令行中配置IP地址, 提示 : 未能配置DHCP服 ...
- K8S 1.20 弃用 Docker 评估之 Docker CLI 的替代产品 nerdctl
背景 2020 年 12 月初,Kubernetes 在其最新的 Changelog 中宣布,自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时. 弃用 Docker 带来的 ...
- Angular 发布IIS
1.IIS服务器需要安装插件 安装 Url https://www.iis.net/downloads/microsoft/url-rewrite 2.修改配置 在src目录下,添加 web.conf ...
- 关于js对象的键
面试的时候,多次被问到Object和Map的区别,我都没答上,我以为可能问原理的可能多一些... 于是今天就仔细地看了一下Object和Map的区别.网上各文章都说Object的键只能是字符串或Sym ...
- Windows打开代理快捷方式
最近使用电脑需要频繁打开关闭网络代理(全局代理会导致一些网站打不开),在想有没有快捷方式,一搜果然有,看来有跟我一样的使用习惯的人. 传统切换代理开关,步骤如下: 设置 => 网络和 Inter ...
- 概率生成函数(PGF)简记
基本搬运自<浅谈生成函数在掷骰子问题上的应用>. 对于定义在非负整数上的离散随机变量 \(X\),级数 \(F(z) = \sum\limits_{i\ge 0} \operatornam ...
- 任务队列神器:Celery 入门到进阶指南
任务队列神器:Celery 入门到进阶指南 发布于2021-03-24 16:24:53阅读 1.9K0 1.什么是celery celery是一个简单,灵活.可靠的分布式任务执行框架,可以支持大 ...
- 上传图片到Mongo数据库;从Mongo数据库下载图片显示到前端
/** * 上传一个图片文件,保存到mongo数据库中 * @param doc * @param parent 文件所在的目录 * @param request * @return */ @Post ...
- wpa_supplicant 交叉编译
交叉编译 wpa_supplicant 指定交叉编译环境: CC=arm-linux-xxxxx-gcc 运行错误 : wlan0: Unsupported driver 'nl80211' 在.c ...