题目链接
CodeForces585 B
题意
- 给你一串非0的正负整数串
- 定义
[l,r]
为$a_l$和$a_r$之间所有元素之积是正数还是负数
- 求串中所有的负数pair的个数和整数pair的个数
题解
- 记录负数对之间的元素个数cnt1,和奇数个负数个数间的元素个数cnt2
- 然后通过当下元素的添加,只会新产生当下元素为右括号的pair,这样就可以dp叠加了
- 具体的看代码中的详细注释吧
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#include <bits/stdc++.h> #define ll long long using namespace std;
const int N = 200 * 1000 + 13;
int n; int a[N];
inline void read() { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } }
inline void solve() { int pos = -1; ll ans0 = 0; for (int i = 0; i < n; i++) { if (a[i] == 0) { pos = i; } if (pos != -1) { ans0 += pos + 1; } }
int cnt1 = 0, cnt2 = 0; int bal = 0; ll ansP = 0; for (int i = 0; i < n; i++) { if (a[i] == 0) { cnt1 = 0, cnt2 = 0, bal = 0; continue; } if (bal % 2 == 0) { cnt1++; } else { cnt2++; } if (a[i] < 0) { bal++; }
if (bal % 2 == 0) { ansP += cnt1; } else { ansP += cnt2; } } cout << n * 1ll * (n + 1) / 2 - ans0 - ansP << ' ' << ansP << endl; }
int main () { #ifdef fcspartakm freopen("input.txt", "r", stdin); #endif srand(time(NULL)); cerr << setprecision(10) << fixed; read(); solve(); return 0; }
|
故事
这场比赛B,C都是1500分,然后我当时不会做B,所以写了B的题解,记录自己不太会的,会的就不记录了
每天一句叨叨
每个人都有潜在的能量,只是很容易:被习惯所掩盖,被时间所迷离,被惰性所消磨。