为什么把函数序列弄出来倒着扫会错
查看原帖
为什么把函数序列弄出来倒着扫会错
19472
明明明明子丶楼主2020/11/23 00:18

"不妨将题目看成:将所有数乘上 mul,再给某些数加上 add_i,其中 mul 是所有被调用的 type II 函数给所有数乘的 V_j之积。" ----第一篇题解

主要部分

for(int i=k;i>=1;i--){
	int kk=ls[i];
	if(f[kk].t==2){
		mul=mul*f[kk].v%mod;
	}
	if(f[kk].t==1){
		int p=f[kk].p,v=f[kk].v;
		add[p]=(add[p]+v*mul%mod)%mod;
	}
}

源代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100005;
const ll mod=998244353;
ll a[N];
struct Fun{
	int t;
	int p,v,n;
	vector<int> s; 
}f[N];
ll mul;
ll add[N];
int ls[N],k;
void f3(int x){
	for(int j=0;j<f[x].n;j++){
		int tt=f[x].s[j];
		if(f[tt].t==3)f3(tt);
		else ls[++k]=tt;
	}
}
int main(){
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		scanf("%lld",a+i);
	int m;
	cin>>m;
//	cout<<m;
	
	for(int i=1;i<=m;i++){
		int t;
		scanf("%d",&t);
		f[i].t=t;
		if(t==1)
			scanf("%d%d",&f[i].p,&f[i].v);
		if(t==2)
			scanf("%d",&f[i].v);
		if(t==3){
			scanf("%d",&f[i].n);
			for(int j=1;j<=f[i].n;j++){
				int p;
				scanf("%d",&p);
				f[i].s.push_back(p);
			}
		}
	}
	int q;
	cin>>q;
	for(int i=1;i<=q;i++){
		int x;
		scanf("%d",&x);
		if(f[x].t==3)f3(x);
		else ls[++k]=x;
	}
	mul=1;
	for(int i=k;i>=1;i--){
		int kk=ls[i];
		if(f[kk].t==2){
			mul=mul*f[kk].v%mod;
		}
		if(f[kk].t==1){
			int p=f[kk].p,v=f[kk].v;
			add[p]=(add[p]+v*mul%mod)%mod;
		}
	}
	for(int i=1;i<=n;i++){
		cout<<(a[i]*mul%mod+add[i])%mod<<' ';
	}
	cout<<endl;
}
2020/11/23 00:18
加载中...