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 ...
随机推荐
- Mysql数据库基础第五章:(二)视图
Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...
- [Maven] 引入依赖以后如果标红怎么办
- c++的double转string(转)
原文地址:https://www.cnblogs.com/finallyliuyu/p/1810071.html c++中double转换成string型(浮点数的格式化)(转) 在日常编程中-- ...
- server2008 安装mongodb
1.下载指定版本 3.6.23 zip压缩文件 ,似乎高版本已经不支持在server2008了! 下载地址:https://www.mongodb.com/try/download/communit ...
- linux下yum安装时出现Loaded plugins: fastestmirror
linux使用yum安装软件时出现报错Loaded plugins:fastestmirror,是提示这个插件不能使用了,fastestmirror是yum的一个加速插件, 解决的办法是:将这个插件禁 ...
- minio对象存储集群安装
环境:centos7.6 .两台服务器部署4个节点集群 minio简介: MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于 ...
- redisTemplate实现分布式锁(释放锁用lua脚本)
package com.xxx.platform.util; import org.springframework.beans.factory.annotation.Autowired; import ...
- 3、k8s 核心实战
7 kubernets核心实战 7.1 资源创建方式 命令行 yaml 7.2 namespace 名称空间来隔离资源 命令行方式 kubectl create ns hello kubectl de ...
- 关于JWT的.net 使用(简单明了直接代码)
首先第一步:下载插件! 在ui层---控制器所在层添加一个类 然后复制如下 using Microsoft.Extensions.Configuration; using Microsoft.Iden ...
- STP理论基础
目的 防止二层环路及防止环路造成的广播风暴以及引起的MAC表震荡 方法 首先,所有配置了STP的交换机互相向相邻交换器(配置了STP的)发送BPDU(协议数据单元),选举根桥(根交换机),根交换机上所 ...