当前位置: 首页 > wzjs >正文

日照网站建设哪一家好整站优化和单词

日照网站建设哪一家好,整站优化和单词,软件开发好学吗,做企业网站怎么备案目录 题目算法标签: 拓扑排序, 组合计数思路代码 题目 2773. 函数调用 算法标签: 拓扑排序, 组合计数 思路 算每个函数最终对答案的贡献是多少, 计算当期加法但是要计算后面乘法的贡献, 用乘法原理和加法原理计算每个函数等效的执行次数, 时间复杂度是线性的 O ( n ) O(n)…

题目

2773. 函数调用
在这里插入图片描述

算法标签: 拓扑排序, 组合计数

思路

算每个函数最终对答案的贡献是多少, 计算当期加法但是要计算后面乘法的贡献, 用乘法原理加法原理计算每个函数等效的执行次数, 时间复杂度是线性的 O ( n ) O(n) O(n)

为什么 m u l mul mul需要按照拓扑序的逆序计算?
假设函数 A A A调用了函数 B B B和函数 C C C, 那么 A A A的最终的 m u l mul mul是取决于 B B B C C C m u l mul mul的, 因此需要按照拓扑序的逆序倒着推, 类似于动态规划的过程, 确保当前状态已经被计算

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;typedef long long LL;
const int N = 1e5 + 10, M = 1e6 + 10, MOD = 998244353;int n, m, q_num;
vector<int> head[N];
int w[N], g[N];
int q[N], deg[N];
struct Func {int t, pos, val;int mul;int sum;
} f[N];void add(int u, int v) {head[u].push_back(v);
}void top_sort() {int h = 0, t = -1;for (int i = 1; i <= m; ++i) {if (deg[i] == 0) q[++t] = i;}while (h <= t) {int u = q[h++];for (int v: head[u]) {if (--deg[v] == 0) q[++t] = v;}}
}void calc_mul() {for (int i = m - 1; i >= 0; --i) {int u = q[i];for (int v : head[u]) {f[u].mul = (LL) f[u].mul * f[v].mul % MOD;}}
}void calc_sum() {for (int i = 0; i < m; ++i) {int u = q[i];int sum = f[u].sum;for (int v : head[u]) {f[v].sum = (f[v].sum + sum) % MOD;sum = (LL) sum * f[v].mul % MOD;}}
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n;for (int i = 1; i <= n; ++i) cin >> w[i];cin >> m;for (int i = 1; i <= m; ++i) {cin >> f[i].t;if (f[i].t == 1) cin >> f[i].pos >> f[i].val;else if (f[i].t == 2) cin >> f[i].val;else {int cnt;cin >> cnt;vector<int> tmp;while (cnt--) {int x;cin >> x;tmp.push_back(x);}// 为了保证结果是正确的, 需要从最后一个子函数向前计算reverse(tmp.begin(), tmp.end());for (int x: tmp) {add(i, x);deg[x]++;}}}// 初始化乘法因子for (int i = 1; i <= m; ++i) {if (f[i].t == 2) {f[i].mul = f[i].val;}else {f[i].mul = 1;}}top_sort();calc_mul();cin >> q_num;for (int i = 1; i <= q_num; ++i) cin >> g[i];// 计算全局的乘法标记和加法标记int sum = 1;for (int i = q_num; i >= 1; --i) {int k = g[i];f[k].sum = (f[k].sum + sum) % MOD;sum = (LL) sum * f[k].mul % MOD;}calc_sum();// 应用全局乘法for (int i = 1; i <= n; ++i) {w[i] = (LL) w[i] * sum % MOD;}// 处理类型1的加法操作for (int i = 1; i <= m; ++i) {if (f[i].t == 1) {w[f[i].pos] = (w[f[i].pos] + (LL) f[i].val * f[i].sum) % MOD;}}for (int i = 1; i <= n; ++i) cout << w[i] << " ";cout << "\n";return 0;
}
http://www.dtcms.com/wzjs/109142.html

相关文章:

  • 政工网站建设世界足球排名
  • 江苏网站建设要多少钱千锋教育的it培训怎么样
  • 重庆公司注册时间百度网站排名优化软件
  • 企业展示型网站怎么建环球资源网官方网站
  • 做网站4000-262-263友情链接网
  • 免费网站制作app网络推广有哪些常见的推广方法
  • 唐山网站建设那家性价比高商业推广
  • 柳州市网站制作公司win7优化工具
  • wordpress站群主题百度开户资质
  • 堵博网站建设如何做网站推广私人
  • 网站动画用什么程序做网络营销做得好的品牌
  • [ 1500元做网站_验收满意再付款! 如何设计推广方案
  • 做3d地形比较好的网站网络文章发布平台
  • 好的做网站架构的书长沙seo优化
  • 想接网站自己做线上推广有哪些渠道
  • 网站开发代理报价表大型营销型网站制作
  • 做网站布为网企业营销型网站建设
  • 网站建设挣钱么个人网页怎么做
  • discuz 网站标题百中搜优化软件
  • 网站开发图片侵权惠州企业网站建设
  • 家电网站源码百度官方下载
  • 专业网站建设顾问怎么制作网站详细流程
  • 枸杞网站怎么做seo综合排名优化
  • 做java网站后台开发需要什么技能营销软文范例大全300
  • app开发制作公司排行榜徐州关键词优化平台
  • 青岛网站建设seo优化制作设计百度搜首页
  • 格力网站建设首页伟哥seo博客
  • dedecms做模板网站如何快速网络推广
  • 深圳app客户端做网站app注册拉新平台
  • 公司网站域名如何申请晋江怎么交换友情链接