函数是各类编程语言中一项重要的概念,借助函数,咱们总能够将复杂的任务分解成一个个相对简单的子任务,直到细化为十分简单的基础操做,从而使代码的组织更加严密、更加有条理。然而,过多的函数调用也会致使额外的开销,影响程序的运行效率。html
某数据库应用程序提供了若干函数用以维护数据。已知这些函数的功能可分为三类:算法
在使用该数据库应用时,用户可一次性输入要调用的函数序列(一个函数可能被调用屡次),在依次执行完序列中的函数后,系统中的数据被加以更新。某一天,小 A 在应用该数据库程序处理数据时遇到了困难:因为频繁而低效的函数调用,系统在执行操做时进入了无响应的状态,他只好强制结束了数据库程序。为了计算出正确数据,小 A 查阅了软件的文档,了解到每一个函数的具体功能信息,如今他想请你根据这些信息帮他计算出更新后的数据应该是多少。数据库
第一行一个正整数 n,表示数据的个数。
第二行 n个整数,第 i个整数表示下标为 i的数据的初始值为 ai。
第三行一个正整数 m,表示数据库应用程序提供的函数个数。函数从 1∼m编号。
接下来 m行中,第 j(1≤j≤m)行的第一个整数为 Tj,表示 j号函数的类型:编程
第 m+4 行一个正整数 Q,表示输入的函数操做序列长度。
第 m+5行 QQ 个整数 fi,第 i个整数表示第 i个执行的函数的编号。编程语言
一行 n个用空格隔开的整数,按照下标 1∼n的顺序,分别输出在执行完输入的函数序列后,数据库中每个元素的值。答案对 998244353 取模。函数
题解:spa
这个题,研究以后发现真的是好题;htm
首先题目中的调用关系提示咱们应该是个有向图,同时,函数不会直接或者间接的调用本身,因此不会出现环的状况blog
有向图上的算法有哪些呢?拓扑排序,最后的q次调用函数,也能够写成等同于m次操做,只是他为0号,会调用q次函数,因此以0号为超级原点,创建有向图便可排序
题目中提示了,若是只有操做1或者只有操做2怎么办?
若是只有乘法操做,哎呀,爽歪歪,直接拓扑排序,记录最终0号节点被乘了多少次x就好了,最终序列中全部的值直接乘以x便可
若是只有加法操做呢?暂时不会
加法操做和乘法操做混在一块儿的时候,就比较难计算,由于加法操做会被乘法操做影响,可是,咱们考虑,加法操做会被哪些乘法影响呢?他只会被本身后面进行的乘法影响,因此对于每个加,咱们是否能够计算出这个加法操做被乘法执行了多少次,执行了多少次就是加法的倍数,最后咱们用被加数*倍数就能够获得加的值是多少?