题意:

题目描述较为繁琐,vj上有翻译版:点这里

思路:

首先可以确定的是,如果玩家 \(2\) 的策略是最优策略,那么其一定会选形如 \(01/10\) 这样的串。因为玩家 \(2\) 必须要选至少一个 \(1\) ,那么一定我们希望每次尽量少用 \(1\) 并且多消耗玩家1需要的 \(0\),这样才可以使得可以撑更多的回合,更优。

又发现,我们如果想让玩家 \(1\) 获胜,那么必然其比玩家 \(2\) 多玩了 \(1\) 轮。考虑玩家 \(2\) 输了最后会出现怎样的局面:

显然有两种情况。第一种是所有 \(1\) 都被拿完了,并且局面还能保证玩家 \(1\) 至少还能玩 \(1\) 轮,第二种是最后还剩一个 \(1\) ,但是没有其他任何元素了,那么此时玩家 \(2\) 也无法胜利。

所以我们考虑记 \(cnt_{0/1}\) 表示序列中 \(0/1\) 的个数,先考虑上述第一种情况,此时玩家 \(2\) 拿完了所有 \(1\) ,并且按照最优策略。那么玩家 \(2\) 就拿了 \(cnt_1\) 个 \(1\) 和 \(0\),此时若要满足玩家 \(1\) 能至少比玩家 \(2\) 多玩一轮,则一定,其拿了 \(2\times(cnt_1 + 1)\) 个 \(0\)。也就等价说明了,要满足玩家 \(1\) 必胜,一定要满足:

\[cnt_0\geq3\times cnt_1+2
\]

什么,你说怎么保证每一次玩家 \(1\) 都可以行动?很简单,我们换一个视角思考这个问题,考虑我们现在已经有了 \(cnt_1\) 个 \(1\),我们将所有的 \(0\) 分配到任意的两个 \(1\) 之间,因为至少有 \(3\times cnt_1+2\) 个 \(0\) 则所有的分配情况下都一定会存在至少有 \(3\) 个连续(相邻)的 \(0\) \((cnt_1>0)\) 的方案,所以不用担心不够用,并且每一轮玩家 \(1\) 和玩家 \(2\) 都进行了游戏后,这个不等式是依然成立的,所以每一次都可以保证玩家 \(1\) 可以行动。

又很显然的,当上述不等式取等时,我们的必胜策略已经到极限了,再让 \(cnt_0\) 变小就无法保证玩家 \(1\) 必胜了,所以上述不等式是充要的。

用同样的分析方法,可以得出如果要产生第二种必胜结局,则一定:

\[cnt_0=3\times cnt_1-1
\]

证明思路同上,略。

现在考虑统计答案,我们试着枚举区间左端点 \(r\),那么我们现在需要知道的就是有多少个 \(l\) 是合法的。显然一个合法的 \(l\) 需要满足的充要条件(情况1)是:

\[(cntr_0-cntl_0)\geq3\times(cntr_1-cntl_1) + 2
\]

我们试着对式子进行变换:

\[(cntr_0-3\times cntr_1)-2\geq cntl_0 - 3\times cntl_1
\]

你发不等式现左边括号中的内容与不等式右边是同构的。所以我们定义函数 \(f(i)=cnti_0-3\times cnti_1\) ,所以不等式变为:

\[f(r) - 2\geq f(l)
\]

那么我们现在只需要找出这样的 \(l\) ,如果我们暴力枚举的话,复杂度是 \(O(n^2)\) 的,显然无法通过本题,但你发现这是一个求区间 \([1,r-1]\) 中的合法下标的问题,既然是区间问题,我们可以考虑建立一颗树状数组来解决这个问题,以减少对前面区间的重复遍历。但是这不是一般的树状数组。事实上,我们应当建立一颗值域树状数组,也就是下标为 \(f(x)\) 中存的东西。并且每次遍历完 \(r\) 后,都需要将树状数组中 \(f(r)\) 的部分加\(1\),即遍历到了多一个值为 \(f(r)\) 的下标 \(r\) ,方便给后面的数计算。

对于情况二是同理的,只是需要注意的是,情况二是等号,所以需要减去小于 \(f(r) + 1\) 的部分的贡献(这么说有点抽象,直接看代码可能更好理解)。

Code:

注意上述分析中 \(f(x)\) 可能为负数,所以需要加一个偏移量来保证树状数组下标的非负。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
inline int read(){
char c=getchar();bool f=0;int x=0;
while(c > '9' || c < '0') f|=c=='-',c=getchar();
while(c >= '0'&&c <= '9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
if(f) x=-x;return x;
} const int M = 4e6 + 10,N = 3e5 + 10;
char s[N];
int n,tree[M],pre[N],up_limit;
int lowbit(int x){return x & (-x);} void add(int x, int k){
for(;x <= up_limit;x += lowbit(x))
tree[x] += k;
} LL query(int x){
LL res = 0;
for(;x;x -= lowbit(x))
res += tree[x];
return res;
} int main()
{
n = read();
scanf("%s",s + 1);
LL ans = 0;
up_limit = 3e6 + 10;
for(int i = 1;i <= n;++i)
{
pre[i] = pre[i - 1] + (s[i] == '0' ? 1 : -3);
}
for(int i = 0;i <= n;++i) pre[i] += 3 * n + 5; add(pre[0],1);
for(int i = 1;i <= n;++i)
{
ans += query(pre[i] - 2) + (query(pre[i] + 1) - query(pre[i]));
add(pre[i],1);
} printf("%lld",ans);
return 0;
}

CF2070E(edu.175) Game with Binary String 题解的更多相关文章

  1. Codeforces #698 (Div. 2) E. Nezzar and Binary String 题解

    中文题意: 给你两个长度为 \(n\) 的01串 \(s,f,\)有 \(q\) 次询问. 每次询问有区间 \([\ l,r\ ]\) ,如果 \([\ l,r\ ]\) 同时包含\(0\)和\(1\ ...

  2. Binary String Matching(kmp+str)

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Given two strings A and B, whose alp ...

  3. Codeforces 862D. Mahmoud and Ehab and the binary string (二分)

    题目链接:Mahmoud and Ehab and the binary string 题意: 一道交互题,首先给出一个字符串的长度l.现在让你进行提问(最多15次),每次提问提出一个字符串,会返回这 ...

  4. Codeforces1107E Vasya and Binary String 记忆化dp

    Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...

  5. Codeforces Round #598 (Div. 3) D. Binary String Minimizing 贪心

    D. Binary String Minimizing You are given a binary string of length n (i. e. a string consisting of ...

  6. Educational Codeforces Round 94 (Rated for Div. 2) String Similarity、RPG Protagonist、Binary String Reconstruction、Zigzags 思维

    题目链接:String Similarity 题意: 首先题目定义了两个串的相似(串的构成是0.1),如果两个串存在对于一个下标k,它们的值一样,那么这两个串就相似 然后题目给你一个长度为2n-1的串 ...

  7. Binary String Matching

    问题 B: Binary String Matching 时间限制: 3 Sec  内存限制: 128 MB提交: 4  解决: 2[提交][状态][讨论版] 题目描述 Given two strin ...

  8. NYOJ之Binary String Matching

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述     Given two strings A and B, whose a ...

  9. ACM Binary String Matching

    Binary String Matching 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Given two strings A and B, whose alp ...

  10. encode_json 会对给定的Perl的数据结构转换为一个UTF-8 encoded, binary string.

    use JSON qw/encode_json decode_json/ ; use Encode; my $data = [ { 'name' => 'Ken' , 'age' => 1 ...

随机推荐

  1. 【语义分割专栏】:FCN实战篇(附上完整可运行的代码pytorch)

    目录 前言 FCN全流程代码 模型搭建(model) 数据处理(dataloader) 评价指标(metric) 训练流程(train) 模型测试(test) 效果图 结语 前言 FCN原理篇讲解:[ ...

  2. 明明是同一条SQL,为什么有时候走索引a,有时候却走索引b ?

    前言 想象你是一家餐厅的服务员,面前有两个菜单: 菜单A:按菜品分类排列(前菜.主菜.甜点) 菜单B:按价格从低到高排列 当顾客说:"我要最便宜的川菜". 你会: 先用菜单B找到所 ...

  3. Java 实现文件和base64字符串互转

    项目中遇到需要将图片转成base64编码的字符串的需求,但是,考虑到扩展性,写了一个可以转换任务类型文件的方法.需要引入的包: <dependency> <groupId>co ...

  4. 腾讯云对象存储工具类和demo

    使用 package com.ruoyi; import java.io.File; public class mytest { private static String secretId = &q ...

  5. ZCPC17th E Easy DP Problem

    ZCPC17th E Easy DP Problem 希望更丰富的阅读体验?来我的网站阅读趴! Problem 由于这题前面的思维推到部分我没有参与,主要是现学(复习)了一下主席树,所以主要讲主席树的 ...

  6. 测试人员在 Scrum 中的角色是什么?

    测试人员在Scrum团队中到底担任什么样的角色?Scrum团队有测试角色吗?测试人员是Scrum团队的正式成员吗? 一.<Scrum指南>对测试的看法 很多人认为Scrum团队中的三个角色 ...

  7. 终极指南:Scrum中如何设置需求优先级

    需求众多不知道如何下手?总想先做简单的需求,复杂需求却一拖再拖?那么,我们是时候开始考虑如何设置需求优先级了. 本期终极指南将展示如何为需求设置有效优先级,如何有效管理工作量,让效率指数倍增长,搭配  ...

  8. 数栈V6.0全新产品矩阵发布,数据底座 EasyMR 焕新升级

    4月20日,袋鼠云成功举行了以"数实融合,韧性生长"为主题的2023春季生长大会.会上,袋鼠云自主研发的一站式大数据基础软件--数栈V6.0产品矩阵全新发布.对旗下大数据基础平台. ...

  9. 读书笔记《Linux内核完全注释》第二章硬件部分

    能源及电源,有了电能就可以控制电子管的通与不通,从而实现与.或.非.异或.位移.脉冲.传输.存储等基础功能.   1:CPU通过系统总线(3合1的通信总线)与其他外设相接. 大多数控制器.控制卡都集成 ...

  10. Android 各个模拟器的 链接上Adb 设备管理的方法

    https://blog.csdn.net/weixin_45598506/article/details/107918803?spm=1001.2101.3001.6661.1&utm_me ...