70分TLE悬关求助
查看原帖
70分TLE悬关求助
366468
_Z_Y_X_SWS楼主2023/8/30 21:00
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=998244353;
ll n,a[100005],m,a2[100005];
bool vis[100005];
struct AAA {
	ll a,b;
};
vector <ll> h[100005];
vector <AAA> hh[100005];
void cz (ll x){
	vector<AAA>b;
	vis[x]=1;
	map<ll,ll>a;
	map<ll,ll>::iterator it;
	ll sum=1;
	for (ll i=h[x][1]+1;i>=2;i--){
		ll k=h[x][i];
		if (h[k][0]==3){
			if (!vis[k]){
				cz(k);
			}
			
			for (int j=1;j<hh[k].size();j++){
			/*	AAA kkk;
				kkk.a=hh[k][j].a;
				kkk.b=hh[k][j].b;
				b.push_back(kkk);*/
				int k1=hh[k][j].a,k2=hh[k][j].b;
				if (h[k1][0]==2){
					sum=sum*h[k1][1]%mod*k2%mod;
				}
				else {
					a[k1]=(a[k1]+k2*sum)%mod;
				}
			}
			sum=sum*hh[k][0].a%mod;
		}
		else {
		/*	AAA aa;
			aa.a=k;
			aa.b=1;
			b.push_back(aa);*/
			int k1=k,k2=1;
			if (h[k1][0]==2){
				sum=sum*h[k1][1]%mod*k2%mod;
			}
			else {
				a[k1]=(a[k1]+k2*sum)%mod;
			}
		}
	}
	
/*	for (ll i=b.size()-1;i>=0;i--){
		ll k1=b[i].a,k2=b[i].b;
		if (h[k1][0]==2){
			sum=sum*h[k1][1]%mod*k2%mod;
		}
		else {
			a[k1]=(a[k1]+k2*sum)%mod;
		}
	}*/
	AAA lll;
	lll.a=sum;lll.b=0;
	hh[x].push_back(lll);
	for (it=a.begin();it!=a.end();it++){
		AAA k;
		k.a=it->first;
		k.b=it->second;
		hh[x].push_back(k);
	}
}
int main (){
	scanf ("%d",&n);
	for (ll i=1;i<=n;i++){
		scanf ("%d",&a2[i]);
	}
	scanf ("%d",&m);
	for (ll i=1;i<=m;i++){
		ll t;
		scanf ("%d",&t);
		h[i].push_back(t);
		if (t==1){
			ll p,v;
			scanf ("%d%d",&p,&v);
			h[i].push_back(p);
			h[i].push_back(v);
		}
		else if (t==2){
			ll v;
			scanf ("%d",&v);
			h[i].push_back(v);
		}
		else {
			ll d;
			scanf ("%d",&d);
			h[i].push_back(d);
			for (ll j=1;j<=d;j++){
				ll x;
				scanf ("%d",&x);
				h[i].push_back(x);
			}
		}
	}
	for (ll i=1;i<=m;i++){
		if (h[i][0]==3&&!vis[i]){
			cz(i);
		}
	}
	int xxx;
	ll cc[100005]={};
	scanf ("%d",&xxx);
	for (int i=1;i<=xxx;i++){
		scanf ("%d",&cc[i]);
	}
	ll sum=1;
	for (int i=xxx;i>0;i--){
		int k=cc[i];
		if (h[k][0]==1){
			int kk=h[k][1];
			a[kk]=(a[kk]+h[k][2]*sum%mod)%mod;
		}
		else if (h[k][0]==2){
			sum=sum*h[k][1]%mod;
		}
		else {
			
			for (int i=1;i<hh[k].size();i++){
				int k1=hh[k][i].a,k2=hh[k][i].b;
				int kk=h[k1][1];
				a[kk]=(a[kk]+h[k1][2]*k2%mod*sum%mod)%mod;
			}
			sum=sum*hh[k][0].a%mod;
		}
	}
	for (int i=1;i<=n;i++){
		cout<<(a[i]+a2[i]*sum%mod)%mod<<" ";
	}
	return 0;
}
2023/8/30 21:00
加载中...