原题传送门
还记得初中的时候Ag学长FancyCoder给我们讲过一个倒着做的思想
这道题不妨倒着做

如果操作 *2 +3 *4
把每个数的初始值看成一次加操作
那么就是 +ai *2 +3 *4
对于这个+3的贡献其实是 + 3 ∗ 4 +3*4 +3∗4,对于 + a i +a_i +ai​,贡献是 + a i ∗ 8 +a_i*8 +ai​∗8

所以倒着做的话,对于每个加操作,乘上当前乘操作的累乘积,就是贡献

可以对于每个函数记一个 m u l i mul_i muli​表示调用一次该函数,会乘上多少
如果函数类型是1,那么 m u l = 1 mul=1 mul=1
如果函数类型是2,那么 m u l = v mul=v mul=v
如果函数类型是3,那么 m u l = ∏ m u l 儿 子 mul=\prod{mul_{儿子}} mul=∏mul儿子​
因为调用关系是一个 D A G DAG DAG,所以可以用拓扑排序,然后得到所有的 m u l mul mul值

想要知道对于所有的加操作,他将要乘上的系数是多少
因为对于一个加操作,可能是直接被调用,可能是通过调用了一个类型 3 3 3函数之后被调用到的

所以可以先到这做一遍,把累乘的系数统计下来
对于每个类型3的操作,把系数像标记下传一样往下传递
这样就处理处每个加操作的系数了

Code:

#include <bits/stdc++.h>
#define maxn 100010
#define LL long long
using namespace std;
const LL qy = 998244353;
struct data{int opt, p;LL v;
}f[maxn];
struct Edge{int to, next;
}edge[maxn << 1];
int num, head[maxn], n, m, deg[maxn], tackle[maxn], tot;
LL mul[maxn], c[maxn], id[maxn], a[maxn];
queue <int> q;inline int read(){int s = 0, w = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;for (; isdigit(c); c=  getchar()) s = (s << 1) + (s << 3) + (c ^ 48);return s * w;
}void addedge(int x, int y){ edge[++num] = (Edge){y, head[x]}, head[x] = num; }void topsort(){for (int i = 1; i <= m; ++i)if (!deg[i]) q.push(i);while (!q.empty()){int u = q.front(); q.pop();id[++tot] = u;for (int i = head[u]; i; i = edge[i].next){int v = edge[i].to;--deg[v];if (!deg[v]) q.push(v);}}
}void multiply(){for (int i = m; i; --i){int u = id[i];if (f[u].opt == 2) mul[u] = f[u].v % qy;else if (f[u].opt == 1) mul[u] = 1;else{mul[u] = 1;for (int j = head[u]; j; j = edge[j].next){int v = edge[j].to;mul[u] = mul[u] * mul[v] % qy;}}}
}void calc(){for (int i = 1; i <= m; ++i){int u = id[i];LL now = 1;for (int j = head[u]; j; j = edge[j].next){int v = edge[j].to;c[v] = (c[v] + now * c[u]) % qy;now = now * mul[v] % qy;}}
}int main(){n = read();for (int i = 1; i <= n; ++i) a[i] = read();m = read();for (int i = 1; i <= m; ++i){f[i].opt = read();if (f[i].opt == 1) f[i].p = read(), f[i].v = read();else if (f[i].opt == 2) f[i].v = read();else{int c = read();while (c--){int x = read();addedge(i, x);++deg[x];}}}topsort();multiply();
//  for (int i = 1; i <= m; ++i) printf("%lld\n", mul[i]);int Q = read();for (int i = 1; i <= Q; ++i) tackle[i] = read();LL now = 1;for (int i = Q; i; --i){int x = tackle[i];c[x] = (c[x] + now) % qy;now = now * mul[x] % qy;}calc();for (int i = 1; i <= n; ++i) a[i] = a[i] * now % qy;for (int i = 1; i <= m; ++i)if (f[i].opt == 1) a[f[i].p] = (a[f[i].p] + f[i].v * c[i] % qy) % qy;for (int i = 1; i <= n; ++i) printf("%lld ", a[i]);return 0;
}

【题解】LuoGu7077:函数调用相关推荐

  1. Python CheckiO 题解系列 丨 博客目录索引

    CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本题解系列主要记录自己在用 Python 闯关时的做 ...

  2. NOIP2016天天爱跑步 题解报告【lca+树上统计(桶)】

    题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn个 ...

  3. 20200827:2020力扣第33周双周赛题解

    2020力扣第33周双周赛题解 题目一 示例 解题思路与代码实现 题目二 示例 解题思路与代码实现 题目三 解题思路与代码实现 题目四 示例 解题思路与代码实现 写在最后 题目一 题目一:千位分隔数 ...

  4. 头歌c语言实训作业题解

    头歌c语言实训作业题解 持续更新 C语言程序设计编辑与调试环境 1.打印输出 Hello World 2.打印输出图形 3.求三个数的最大值 4.熟悉C语言调试环境 C语言中最基本的输入输出 1.看看 ...

  5. 寒假“搜索”练习题解

    1.P1605 迷宫 题目背景 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫中移动有上下左 ...

  6. 2021CCPC新疆省赛题解BDEFGHIJK

    2021CCPC新疆省赛题解BDEFGHIJK K. chino with c language 题意 memcpy()memcpy()memcpy()不会检查源地址范围与目标地址范围是否重叠,它只从 ...

  7. 一些比赛的题解(共32场)

    之前写在本地的,丢上来测试一下 1. Educational Codeforces Round 56 E 题意:映射后即为,给一个排列,支持两种操作:询问区间[lb,rb]内权值在[la,ra]内的数 ...

  8. 西邮Linux小组22-20纳新面试题目及题解

    西邮Linux兴趣小组2022纳新面试题题解 感谢 Zhilu 重新录入题目原件.好人一生平安. 本题目只作为Xiyou Linux兴趣小组2022纳新面试的有限参考. 为节省版面,本试题的程序源码省 ...

  9. 2019字节跳动研发笔试题题解(C++)

    第一题: 用STL的string的 find 和 erase: 首先,通过find找到需要删除的字符/字符串的位置: string str; string target; int pos = str. ...

最新文章

  1. 蓝桥杯四平方和Java_蓝桥杯 四平方和
  2. Centos7 下Redis3安装
  3. Asp.net MVC2.0系列文章-MVC简介篇
  4. 熔断器---Hystrix
  5. Django08-1:模型层(ORM)--聚合查询/分组查询/F与Q查询/开启事务/常用字段及参数/自定义字段/数据库查询优化
  6. Beta 冲刺 (4/7)
  7. C++ 标准模板库STL
  8. verilog代码编写工具
  9. ie8打不开mysql登录_Win7下IE8无法打开https类型的网站解决方法笔记
  10. 基于ROS的机器人设计
  11. 计算机DNS怎么配置,如何设置电脑的dns地址
  12. 用“牛顿迭代法”求根号2的近似值
  13. 带通滤波器中心频率计算公式中R是哪个值_三个零件组成矿石收音机,LC电路谐振频率换算及零件选购是关键...
  14. stm32 esp8266 MG90S 机械数码管
  15. ASTERISK 拨号方案基础
  16. JSON字符串转换成List对象集合
  17. 商业化广告--体系学习-- 2 -- 行业蓝图篇 -- 广告产品与商业模式
  18. 物理实验室--Java实现的物理仿真
  19. rdworksv8教学说明书_操作说明书-深圳睿达科技有限公司.PDF
  20. 接龙大师v2.3.0

热门文章

  1. string indices must be integers错误原因
  2. 【Python】python镜像源配置方法
  3. 阿里九年架构师教你如何学会阅读源码
  4. hive 分区表select全部数据_Hive分区表的分区操作
  5. bmi 指数计算pyhton代码实现
  6. 基于卷积神经网络的CSI步态信息研究(附源码地址)
  7. aws DynamoDB 读/写容量模式
  8. 大学学什么课会用到matlab,高校蹭课?这份蹭课攻略请收好!| 内附福利
  9. 全球大学TOP100的雅思分数要求一览
  10. javaWeb实训项目总结