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 ...
随机推荐
- 跳板攻击之:NPS代理转发
跳板攻击之:NPS代理转发 目录 跳板攻击之:NPS代理转发 1 NPS介绍 2 NPS特点 3 实验环境 3.1 实验准备 3.2 实验拓扑 3.3 NPS配置 3.3.1 conf/nps.con ...
- Android:ViewModel
什么是 ViewModel ViewModel 旨在以注重生命周期的方式存储和管理界面相关数据.ViewModel 让数据可在发生屏幕旋转等配置更改后继续留存. 上面一段话是截取自官方文档对 View ...
- let 和 var 的区别
var 关键字 在块级作用域中使用var声明变量,外面同级的块级作用域也可以访问.if.switch.for 等语句的作用域都没有块级作用域,所以说,在这些语句中声明的变量都能被外界访问,这是非常不安 ...
- 需要登陆,请求数据 session
requests中的session模块思路:# 1. 登录 --> 等到cookie# 2.带着cookie 请求到书架的url-->书架上的内容#注意:# 两个操作要连续起来操作# 我们 ...
- web生命周期概览
1, 输入URL(或单击连接). 2, 生成请求并发送至服务器. 3,执行某些动作或者获取某些资源;将响应发送给客户端. 4,处理HTML,CSS和JavaScript并构建结果页面. 5,监控事件队 ...
- 记录 mysql修改密码报错问题 (ERROR 1054 (42S22): Unknown column 'password' in 'field list')
报错如图: 查了相关文档 MySQL官网手册表示MySQL5.7版本后,password这个字段被改成 authentication_string, 命令修改如下: update user set a ...
- python中的上下文管理器以及python内建模块contextlib的contextmanager方法
上下文管理器 上下文管理器是实现了上下文管理协议的对象,其特有的语法是"with -as".主要用于保存和恢复各种全局状态,关闭文件等,并为try-except-finally提供 ...
- Neo4j安装及简单使用【转】
转载防丢失. 一.Neo4j和图数据库简介 neo4j是基于Java语言编写图形数据库.图是一组节点和连接这些节点的关系.图形数据库也被称为图形数据库管理系统或GDBMS. Neo4j的是一种流行的图 ...
- 中间件Middleware 使用及相关概念
中间件是装配再应用管道里处理请求和相应的软件,是使用Use,Map,Run扩展方法配置的请求委托,请求委托可以是类,或者匿名方法.每个中间件可调用下一个中间件,直到终端中间件(不调用下一个中间件的就是 ...
- js区分图片加载中和加载完成状态
var _ent = document.getElementById("test"); if (_ent.complete) { //图片已经加载完成 _ent.stop(); } ...