此题着重考虑每加上一个数会对,前面得-+0产生什么样的影响。分析可知插入0为特殊点。然后就可以通过代码实现。
1 1 0 1 3 41 -1等模拟运行下就能法现其规律。
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 5 using namespace std; 6 typedef long long LL; 7 LL _1 = 0, _0 = 0, __1 = 0; 8 LL cnt1, last, cnt2; 9 10 void add(int num, int pos){ 11 12 if(num == 0){ 13 _0 += pos; 14 last = pos; 15 cnt1 = cnt2 = 0; 16 return; 17 } 18 if(num > 0){ 19 _1 += (++cnt1), _0 += last, __1 += cnt2; 20 return; 21 } 22 _1 += cnt2, __1 += (++cnt1), _0 += last; 23 swap(cnt1, cnt2); 24 } 25 26 int main(){ 27 int n, m; 28 cin >> n >> m; 29 int cnt = 0; 30 for(int i = 0; i < n; ++ i){ 31 cnt++; 32 int num; 33 cin >> num; 34 add(num, cnt); 35 } 36 37 while(m--){ 38 int op; 39 cin >> op; 40 if(op == 2) cout << _1 << " " << _0 << " " << __1 << endl; 41 else{ 42 int t; 43 cin >> n; 44 for(int i = 0; i < n; ++ i){ 45 int num; 46 cnt++; 47 cin >> num; 48 add(num, cnt); 49 } 50 } 51 } 52 return 0; 53 54 }