【CSP2020提高组正式赛】贪吃蛇(snakes)
思路
混杂着乘法和加法时,我们发现加法会受到后面执行的乘法操作影响——具体表现就是加数乘上一个系数。这样子朴素的计算我们极大地受困于操作的顺序。因此 , 我们要消除顺序的影响 。
我们不妨设 f[u] 表示在 操作 u 之后所有执行到的乘法操作的乘积 , 那么只要倒叙做一遍操作我们就可以处理出往后的操作对现在的影响 ,言下之意就是现在要处理 操作u 内部中 , 后面的乘法操作对前面的加法操作的影响。这本质上是跟之前一样的问题。
根据乘法分配律 , 我们发现只需把系数挂在 ,根据指向关系建成的
DAG 对应节点上 , 依次向下传便可以记录 所有加法操作的系数之和。
#include<cstdio>
#include<vector>
#define P 998244353
using namespace std;
const int N = 1e5 + 100;
inline void read(int &x)
{
x = 0;char c = getchar();
while(c > '9' || c < '0') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - '0' , c = getchar();
}
inline int mo(int x){
return x >= P ? x - P : x;}
vector<int> rec[N];
struct note
{
int t , po , v;
}opt[N];
int x[N] , n , m , f[N] , g[N] ,<