正题

题目链接:https://www.luogu.com.cn/problem/P7077


题目大意

有一些函数分为三种

  1. 让一个位置的数加上一个数
  2. 让所有数乘上一个数
  3. 按顺序执行一些函数

然后不会有环,按顺序调用一些函数,求最后每个位置的数。


解题思路

我们发现对于一个乘操作其实就是相当于让前面的操作多执行若干次。

那么我们可以将一个333函数拆成:执行一些函数若干次然后最后乘上一个数。

那么我们可以做一次拓扑排序,然后反着求出每个函数最后乘上的那个数。

之后正着做,对于每个函数我们直接按照输入顺序反着(也就是邻接表顺序)枚举然后处理出每个函数要被该函数调用多少次,这样我们可以处理出每个函数的操作次数即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10,XJQ=998244353;
ll redin(){ll x=0,f=1;char c=getchar();while(!(c>='0'&&c<='9')){if(c=='-')f=-f;c=getchar();}while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
struct node{ll to,next;
}a[N*12];
ll n,m,tot,Q,ls[N],w[N],pos[N],val[N];
ll q[N],in[N],z[N],mul[N],ans[N];
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;in[y]++;return;
}
void topsort(){ll tail=0,head=1;q[++tail]=n;for(ll i=1;i<n;i++)if(!in[i])q[++tail]=i;while(head<=tail){ll x=q[head++];for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;in[y]--;if(!in[y])q[++tail]=y;}}n=tail;return;
}
int main()
{m=redin();for(ll i=1;i<=m;i++)w[i]=redin();n=redin();for(ll i=1;i<=n;i++){ll op=redin();mul[i]=1;if(op==1)pos[i]=redin(),val[i]=redin();else if(op==2)mul[i]=redin();else if(op==3){ll k=redin(),y;for(ll j=1;j<=k;j++){y=redin();addl(i,y);}}}ll cnt=n;mul[++n]=1;Q=redin();while(Q--){ll x=redin();addl(n,x);}topsort();for(ll p=n;p>=1;p--){ll x=q[p];for(ll i=ls[x];i;i=a[i].next)mul[x]=mul[x]*mul[a[i].to]%XJQ;}z[q[1]]=1;for(ll p=1;p<=n;p++){ll x=q[p],g=1;for(ll i=ls[x];i;i=a[i].next){(z[a[i].to]+=z[x]*g%XJQ)%=XJQ;g=g*mul[a[i].to]%XJQ;}}for(ll i=1;i<=cnt;i++)ans[pos[i]]=(ans[pos[i]]+z[i]*val[i]%XJQ)%XJQ;for(ll i=1;i<=m;i++)printf("%lld ",(ans[i]+w[i]*mul[q[1]]%XJQ)%XJQ);return 0;
}

P7077-函数调用【拓扑排序,dp】相关推荐

  1. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  2. 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 456  Solved: 215 [Submit][St ...

  3. Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )

    链接:https://ac.nowcoder.com/acm/contest/160/B 来源:牛客网 题目描述 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符 ...

  4. [多校联考-西南大学附中]切面包(线段树/概率与期望)+ Slow Path Finding Algorithm(拓扑排序/DP)+ 分数转化(数论)

    文章目录 T1:分数转换 题目 题解 代码实现 T2:Slow Path Finding Algorithm 题目 题解 代码实现 T3:切面包 题目 题解 代码实现 T1:分数转换 题目 Time ...

  5. 【UVA 437】The Tower of Babylon(拓扑排序+DP,做法)

    [Solution] 接上一篇,在处理有向无环图的最长链问题的时候,可以在做拓扑排序的同时,一边做DP; 设f[i]表示第i个方块作为最上面的最高值; f[y]=max(f[y],f[x]+h[y]) ...

  6. [jzoj 4246] 【五校联考6day2】san {spfa+dfs/spfa+拓扑排序+dp}

    题目 Description 小明经常去N 个地点,其中有些地点之间有直接的无向道路(共M 条这样的道路),可以直接互相到达,这些道路的长短不一.由于小明对这些道路都很熟悉,无论起点和终点在哪里,总能 ...

  7. 【拓扑排序+dp】Hzy's Rabbit Candy

    Hzy's Rabbit Candy 题目描述 Hzy和她的m只兔兔在一个n个点m条边的有向无环图上玩. 为了让兔兔们开心,Hzy带了一些糖.Hzy可以从任何一个点开始,走到任何一个点结束.在这途中, ...

  8. P1983 [NOIP2013 普及组] 车站分级——拓扑排序+dp

    [NOIP2013 普及组] 车站分级 题目描述 一条单向的铁路线上,依次有编号为 $1, 2, -, n $的 $n $个火车站.每个火车站都有一个级别,最低为 111 级.现有若干趟车次在这条线路 ...

  9. [拓扑排序][DP][Tarjan][并查集]JZOJ 4253 QYQ在艾泽拉斯

    Description 在艾泽拉斯的无尽之海里,有着一群不为人知的由各个种族的冒险者统治的岛屿,这些岛屿都很庞大,足以在上面建造许多的城市,城市之间有一些单向道路连接. 有一天,QYQ无意中发现了这些 ...

最新文章

  1. 【GoLang】GoLang 遍历 map、slice、array方法
  2. 关闭软盘_乔布斯签名软盘驱动器即将开拍 成交价预计达7500美元
  3. lwip接收文件 stm32_接收数据
  4. java kafka 多线程消费
  5. 《看聊天记录都学不会C#?太菜了吧》(6)多晦涩的专业术语原来都会那么简单
  6. CRISPR基因编辑
  7. 第一个冲刺周期-第三天
  8. 在没有 IIS 的条件下运行 ASMX(WebService)
  9. mac上如何安装oracle,在mac上安装oracle instant client 和 sqlplus
  10. linux 软键盘输入密码,Linux系统中使用屏幕键盘的方法
  11. matlab教程 导入数据,MATLAB数据导入
  12. nginx + tomcat 504 解决方案
  13. linux下find命令的详细说明
  14. 内网渗透笔记——三层发现and四层发现
  15. matlab波形相似系数,如何用matlab计算波形相似系数
  16. python参数内存地址
  17. 公司员工公寓楼建设项目电力监控系统的研究与应用
  18. linux(07)之内核系统调用
  19. Java基础 DAY14
  20. 2020牛客暑期多校训练营(第八场)E Enigmatic Partition —— 找规律,差分上差分,有丶东西

热门文章

  1. tftp 服务器 ip_360Stack裸金属服务器部署实践
  2. datatables 一列显示两个字段的数据_【tableau入门教程16】计算字段
  3. 程序员吐槽_产品经理吐槽大会,程序员勿入
  4. python静态变量和静态方法_python的静态成员变量、实例成员变量、静态方法、类方法、实例方法...
  5. matlab 抽样判决代码,matlab抽样判决器
  6. mysql序列increment_MySQL 序列 AUTO_INCREMENT
  7. 华硕路由器 linux上不了网,华硕ASUS路由器连不上网怎么办?
  8. java地图 热力图,腾讯地图数据可视化之热力图
  9. android 开启一个定时线程_Android 定时任务刷新的多种实现方式
  10. 7-2 银行家算法--申请资源 (30 分)