题解:CF2131F Unjust Binary Life
Claire0918 · · 题解
我们注意到
分类讨论这个值是
我们考虑是否有
Code:
#include<bits/stdc++.h>
#define mem(a, v) memset(a, v, sizeof(a))
using namespace std;
const int maxn = 2e5 + 10;
int t, n;
long long res;
int a[maxn], b[maxn], prea[maxn], preb[maxn], pd[maxn << 1], *d = pd + maxn;
long long pspos[maxn << 1], psval[maxn << 1], *spos = pspos + maxn, *sval = psval + maxn;
int main(){
scanf("%d", &t);
while (t--){
scanf("%d", &n), getchar(), res = 0;
for (int i = -n; i <= n + 1; i++){
d[i] = spos[i] = sval[i] = 0;
}
for (int i = 1; i <= n; i++){
prea[i] = prea[i - 1] + (a[i] = getchar() - '0');
}
getchar();
long long sum = 0;
for (int i = 1; i <= n; i++){
sum += (preb[i] = preb[i - 1] + (b[i] = getchar() - '0'));
const int p = (preb[i] << 1) - i;
d[p]++, spos[p] += i, sval[p] += preb[i];
}
for (int i = n; i >= -n; i--){
d[i] += d[i + 1], spos[i] += spos[i + 1], sval[i] += sval[i + 1];
}
for (int i = 1; i <= n; i++){
const long long p = i - (prea[i] << 1), k = d[p];
res += k * (i - prea[i]) + (n - k) * prea[i] + spos[p] - sval[p] + (sum - sval[p]);
}
printf("%lld\n", res);
}
return 0;
}