数字游戏【后缀积问题,一个数学分析问题】

此题着重考虑每加上一个数会对,前面得-+0产生什么样的影响。分析可知插入0为特殊点。然后就可以通过代码实现。

1 1 0 1 3 41 -1等模拟运行下就能法现其规律。

数字游戏【后缀积问题,一个数学分析问题】

#include <algorithm>
#include <iostream>
#include <cstring>

using namespace std;
typedef long long LL;
LL _1 = 0, _0 = 0, __1 = 0;
LL cnt1, last, cnt2;

void add(int num, int pos){

	if(num == 0){
		_0 += pos;
		last = pos;
		cnt1 = cnt2 = 0;
		return;
	}
	if(num > 0){
		_1 += (++cnt1), _0 += last, __1 += cnt2;
		return;
	}
	_1 += cnt2, __1 +=  (++cnt1), _0 += last;
	swap(cnt1, cnt2);
}

int main(){
	int n, m;
	cin >> n >> m;
	int cnt = 0;
	for(int i = 0; i < n; ++ i){
		cnt++;
		int num;
		cin >> num;
		add(num, cnt);
	}

	while(m--){
		int op;
		cin >> op;
		if(op == 2) cout << _1 << " " << _0 << " " << __1 << endl;
		else{
			int t;
			cin >> n;
			for(int i = 0; i < n; ++ i){
				int num;
				cnt++;
				cin >> num;
				add(num, cnt);
			}
		}
	}
	return 0;

}

相关推荐