C Sum of Suffix Sums

题目大意和思路可以看这篇帖子里的资料:https://ac.nowcoder.com/discuss/1295959?type=101&order=0&pos=2&page=1&channel=-1&source_id=1

思路

题目的大概要求是求对一数组每次操作之后的后缀和的和(之后记作

看到这个题面就想到了最近在巩固的栈,题目的描述跟栈的操作如出一辙,不妨把题目的数组a用c++STL的stack来处理。
题目的操作无非就是把栈顶的个元素弹出,再把给定的数字压栈,处理完之后计算。这个所谓后缀和的和,是有一定规律的。 alt 可以看到,大概的形式就是这样,这里假设,看一下的变化情况: alt 可以发现,的变化大概就是减去栈顶的元素乘以栈的元素个数(数组长度),再加上新入栈的元素乘以栈的元素个数(数组长度)
依此类推,如果,应该是;
之后的情况也可以简易的推导出来。
代码实现的话就如果就一直弹出栈顶元素并且,再把v入栈并且就好

代码实现

// 每次操作之后,后缀和的和
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
const ll mod = 1000000007;

stack<ll> a; // 原数组
ll suffix; // 后缀和的和

void solve() {
    ll t, v; cin >> t >> v; // t去掉的个数,v添加的数值
    
    while(t > 0) {
        suffix = (suffix % mod- a.top() * a.size() % mod + mod) % mod;
        a.pop();
        t --;
    } // t > 0时一直出栈并且suffix累减
    
    a.push(v);
    suffix = (suffix % mod + a.top() * a.size() % mod) % mod;
    // 最后加上v带来的变化
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int q; cin >> q;
    while(q --) {
        solve();
        cout << suffix << endl;
    }
}

关于取模操作的话之前有看到这个同余关系
(a - b) % m = (a % m - b % m + m) % m;
这里别忘了+m,否则可能会有点儿问题