75分MLE蒟蒻求助
查看原帖
75分MLE蒟蒻求助
308384
Morpheuse楼主2021/9/2 19:33

各位大佬们是怎么储存每个类型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;
}

码风诡异 很多多余的奇怪的操作请轻喷

2021/9/2 19:33
加载中...