c++#抄就完了!
2025-09-06 16:51:30
发布于:天津
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
const int N=100005,P=998244353;
int n,m,Q;
stdvector<int> G1[N],G2[N];
int cnt[N];
int data[N],tp[N],mul[N],add[N],pos[N];
int deg1[N];
void topo1(){
static stdqueue<int> q;
for(int i=0;i<=m;++i){
deg1[i]=G2[i].size();
if(deg1[i]==0)q.push(i);
}
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i!=G1[u].size();++i){
int v=G1[u][i];
mul[v]=(long long)mul[v]mul[u]%P;
--deg1[v];
if(deg1[v]==0)q.push(v);
}
}
}
int deg2[N];
void topo2(){
static std::queue<int>q;
for(int i=0;i<=m;i){
deg2[i]=G1[i].size();
if(deg2[i]0)q.push(i);
}
while(!q.empty()){
int u=q.front();
int now_mul=1;
q.pop();
for(int i=G2[u].size();i!=0;--i){
int v=G2[u][i-1];
cnt[v]=(cnt[v]+(long long)cnt[u]now_mul)%P;
now_mul=(long long)now_mulmul[v]%P;
--deg2[v];
if(deg2[v]0)q.push(v);
}
}
}
#include<cctype>
char gc(){
static char buf[1<<16],*p1=buf,*p2=buf;
if(p1p2){
p2=(p1=buf)+fread(buf,1,1<<16,stdin);
if(p1p2)return EOF;
}
return *p1;
}
template<typename _Tp>
void read(_Tp &x){
x=0;
char c=gc();
while(!isdigit(c))c=gc();
while(isdigit(c))x=x10-48+c,c=gc();
}
int main(){
read(n);
for(int i=1;i<=n;++i)read(data[i]);
read(m);
mul[0]=1;
for(int i=1;i<=m;++i){
read(tp[i]);
if(tp[i]==1){
read(pos[i]),read(add[i]);
mul[i]=1;
}
if(tp[i]==2){
read(mul[i]);
}
if(tp[i]==3){
mul[i]=1;
int len;
read(len);
for(int j=0;j<len;++j){
int v;
read(v);
G1[v].push_back(i);
G2[i].push_back(v);
}
}
}
read(Q);
cnt[0]=1;
for(int i=0;i<Q;++i){
int x;
read(x);
G2[0].push_back(x);
G1[x].push_back(0);
}
topo1();
topo2();
for(int i=1;i<=n;++i)data[i]=(long long)data[i]*mul[0]%P;
for(int i=1;i<=m;++i){
if(tp[i]==1){
data[pos[i]]=(data[pos[i]]+(long long)cnt[i]*add[i])%P;
}
}
for(int i=1;i<=n;++i){
printf("%d ",data[i]);
}
return 0;
}
这里空空如也
有帮助,赞一个