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来处理。
题目的操作无非就是把栈顶的个元素弹出,再把给定的数字
压栈,处理完之后计算
。这个所谓后缀和的和,是有一定规律的。
可以看到,
大概的形式就是
这样,这里假设
,看一下
的变化情况:
可以发现,
的变化大概就是减去栈顶的元素乘以栈的元素个数(数组长度),再加上新入栈的元素乘以栈的元素个数(数组长度)
依此类推,如果,应该是
;
之后的情况也可以简易的推导出来。
代码实现的话就如果就一直弹出栈顶元素并且
,再把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,否则可能会有点儿问题