社区讨论
55分求助
P7077[CSP-S 2020] 函数调用参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @locjig47
- 此快照首次捕获于
- 2023/10/30 14:49 2 年前
- 此快照最后确认于
- 2023/11/05 02:07 2 年前
CPP
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll mod=998244353;
int n,m,Q,C,TOT,X;
ll a[maxn],in1[maxn],in2[maxn];
struct change{
int op,pos,val;
ll mul,add;
}func[maxn];
vector<int> v1[maxn],v2[maxn];
void topo1(){
queue<int> q;
for(int i=0;i<=m;i++){
in1[i]=v2[i].size();
if(!v2[i].size()){
q.push(i);
}
}
while(q.size()){
int now=q.front();
q.pop();
for(int i=0;i<v1[now].size();i++){
in1[v1[now][i]]--;
func[v1[now][i]].mul*=func[now].mul;
func[v1[now][i]].mul%=mod;
if(!in1[v1[now][i]])
q.push(v1[now][i]);
}
}
return ;
}
void topo2(){
queue<int> q;
for(int i=0;i<=m;i++){
in2[i]=v1[i].size();
if(!in2[i])
q.push(i);
}
while(q.size()){
int now=q.front();
q.pop();
ll now_mul=1;
for(int i=v2[now].size()-1;i>=0;i--){
in2[v2[now][i]]--;
func[v2[now][i]].add+=func[now].add*now_mul;
func[v2[now][i]].add%=mod;
now_mul*=func[v2[now][i]].mul;
now_mul%=mod;
if(!in2[v2[now][i]])
q.push(v2[now][i]);
}
}
return ;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d",&func[i].op);
if(func[i].op==1){
scanf("%d%d",&func[i].pos,&func[i].val);
func[i].mul=1;
}
if(func[i].op==2)
scanf("%lld",&func[i].mul);
if(func[i].op==3){
scanf("%d",&TOT);
func[i].mul=1;
for(int j=1;j<=TOT;j++){
scanf("%d",&C);
v1[C].push_back(i);
v2[i].push_back(C);
}
}
}
scanf("%d",&Q);
for(int i=1;i<=Q;i++){
scanf("%d",&X);
v1[X].push_back(0);
v2[0].push_back(X);
}
func[0].mul=1;
func[0].add=1;
topo1();
topo2();
for(int i=1;i<=m;i++){
a[i]*=func[0].mul;
a[i]%=mod;
}
for(int i=1;i<=m;i++)
if(func[i].op==1){
a[func[i].pos]+=func[i].add*func[i].val;
a[func[i].pos]%=mod;
}
for(int i=1;i<=n;i++)
printf("%lld ",a[i]);
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...