社区讨论
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 条回复,欢迎继续交流。
正在加载回复...