专栏文章
题解:CF2131F Unjust Binary Life
CF2131F题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minweqhw
- 此快照首次捕获于
- 2025/12/02 09:27 3 个月前
- 此快照最后确认于
- 2025/12/02 09:27 3 个月前
我们注意到 当且仅当 ,所以能从 走到 当且仅当
分类讨论这个值是 还是 。我们记 ,那么这个值为 时 ,为 时 ,于是 ,答案即求
我们考虑是否有 ,即 。将 和 的贡献拆开,一个 在所有满足该条件的 上贡献 ,否则贡献 。我们设一个 中有 个 满足条件,那么 就有 次贡献 , 次贡献 。我们仅需对于任何 维护所有满足条件的 的 即可。我们注意到 和 都是 的,于是我们直接差分即可维护,时间复杂度 。
Code:
CPP#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;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...