各位大佬们是怎么储存每个类型3函数对序列里面某个数的单点加? 我的思路是把每次增加的结果储存到一个统一的数组(代码中的totalv和totalp)里 在调用类型3函数的时候根据原先储存的下标(h.change)来调用
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 100010;
const int maxc = 1000010;
const LL mod = 998244353;
struct node
{
short type;
int p,v,c;//p下标 v 加 / 乘 c 调用个数
LL mul;
vector<LL> change;//调用函数
vector<int> t3;
}h[maxn];//储存函数
vector<int> totalp;
vector<int> totalv;
struct bei
{
short yuan;
LL xian;
}a[maxn];
int n,m,z[maxn];
LL linshi;
int sum = 0;
bool vis[maxc];
void zk(int x)
{
vis[x] = 1;
h[x].change.resize(1);
h[x].mul = 1;
for(int i = h[x].t3.size() - 1 ; i >= 1 ; i --)
{//遍历函数
int now = h[x].t3[i];
if(h[now].type == 1)
{
if(x == 0)
{
a[h[now].p].xian = (a[h[now].p].xian + h[now].v * h[x].mul % mod) % mod;
}
else
{
h[x].change.push_back(++sum);
totalp.push_back(h[now].p);
totalv.push_back((h[now].v * h[x].mul) % mod);
}
}
else
{
if(h[now].type == 2)
{
h[x].mul = h[x].mul * h[now].v % mod;
}
else
{
if(h[now].type == 3)
{
if(vis[now] == 0 || h[now].mul == 0)
zk(now);
if(x == 0)
{
for(int j = 1 ; j <= h[now].change.size() - 1 ; j ++)
{
a[totalp[h[now].change[j]]].xian = (a[totalp[h[now].change[j]]].xian + totalv[h[now].change[j]] * h[x].mul % mod) % mod;
}
}
else
{
for(int j = 1 ; j <= h[now].change.size() - 1; j ++)
{
h[x].change.push_back(++sum);
totalp.push_back(totalp[h[now].change[j]]);
totalv.push_back(totalv[h[now].change[j]] * h[x].mul % mod);
}
}
h[x].mul = h[x].mul * h[now].mul % mod;
}
}
}
}
}
int main()
{
totalv.resize(1);
totalp.resize(1);
scanf("%d", &n);
for(int i = 1 ; i <= n ; i ++)
scanf("%d", &a[i].yuan);
for(int i = 1 ; i <= n ; i ++)
a[i].xian = a[i].yuan;
scanf("%d", &m);
for(int i = 1 ; i <= m ; i ++)
{
scanf("%d", &h[i].type);
if(h[i].type == 1)
scanf("%d%d", &h[i].p,&h[i].v);
else
if(h[i].type == 2)
scanf("%d", &h[i].v);
else
{
scanf("%d", &h[i].c);
h[i].t3.resize(1);
for(int j = 1 ; j <= h[i].c; j ++)
{
int x;
scanf("%d", &x);
h[i].t3.push_back(x);
}
}
}
scanf("%d", &h[0].c);
h[0].t3.resize(h[0].c + 1);
for(int i = 1 ; i <= h[0].c ; i ++)
scanf("%d", &h[0].t3[i]);
zk(0);
for(int i = 1 ; i <= n ; i ++)
{
linshi = a[i].xian - a[i].yuan;
a[i].xian = a[i].yuan * h[0].mul % mod;
a[i].xian = (a[i].xian + linshi) % mod;
cout<<a[i].xian<<' ';
}
return 0;
}
码风诡异 很多多余的奇怪的操作请轻喷