社区讨论

70分MLE球跳

P7077[CSP-S 2020] 函数调用参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhj4xwi9
此快照首次捕获于
2025/11/03 20:47
4 个月前
此快照最后确认于
2025/11/03 20:47
4 个月前
查看原帖
CPP
#include<iostream>
#include<vector>
#define int long long
using namespace std;
const int mod=998244353;
struct sd{
	bool f;
	int x,y;
};
int n,m,q,c=1;
int a[114514];
int t[114514];
vector<sd> v[114514],sb;
vector<int> g[114514];
void dfs(int x){
	if(v[x].size())return;
	for(int i:g[x]){
		dfs(i);
		v[x].insert(v[x].end(),v[i].begin(),v[i].end());
	}
}signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}cin>>m;
	for(int i=1;i<=m;i++){
		cin>>t[i];
		if(t[i]==1){
			int x,y;
			cin>>x>>y;
			v[i].push_back({0,x,y});
		}else if(t[i]==2){
			int x;
			cin>>x;
			v[i].push_back({1,x,0});
		}else{
			int len;
			cin>>len;
			for(int j=1;j<=len;j++){
				int x;
				cin>>x;
				g[i].push_back(x);
			}
		}
	}for(int i=1;i<=m;i++){
		if(!v[i].size()){
			dfs(i);
		}
	}cin>>q;
	while(q--){
		int x;
		cin>>x;
		sb.insert(sb.end(),v[x].begin(),v[x].end());
	}for(int i=sb.size()-1;i>=0;i--){
		if(!sb[i].f){
			sb[i].y*=c;
			sb[i].y%=mod;
		}else{
			c*=sb[i].x;
			c%=mod;
		}
	}for(int i=1;i<=n;i++){
		a[i]*=c;
		a[i]%=mod;
	}for(sd i:sb){
		if(!i.f){
			a[i.x]+=i.y;
			a[i.x]%=mod;
		}
	}for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	return 0;
}
我的思路主要是用记忆化搜索把所有类型为3的函数拆解成类型为1、2的函数,然后再用超级常数*n解决计算,时间非常充裕,只要解决空间的问题就行了

回复

0 条回复,欢迎继续交流。

正在加载回复...