题目传送门(内部题37)


输入格式

第一行一个整数$n$,表示区间的长度.
第二行一个长度为$n$的只包含$0,1,2$的字符串,表示给出的序列。


输出格式

一行一个整数,表示革命的区间的数量。


样例

样例输入:

10
0000111011

样例输出:


数据范围与提示

第$1$个测试点,$n=100$
第$2,3$个测试点,$n=1,000$
第$4$个测试点,$n=50,000$
第$5,6$个测试点,$n={10}^5$
第$7,8,9,10$个测试点,$n=5\times {10}^6$
第$2,4,5,7$个测试点还满足:给出的序列中只含$0$和$1$


题解

显然需要用到前缀和,那么我们设$s_0,s_1,s_2$分别表示$0,1,2$的前缀和。

那么对于一个区间$(l,r)$,只有当这个区间满足$s_r-s_{l-1}>\frac{r-l+1}{2}$的时候满足,化简式子,$2\times s_r+r-1>2\times s_{l-1}+l$。

但是显然这样求会重复,那么我么考虑这样一个问题,对于一个区间,$0,1,2$中只有一个可能会超过区间的一半,所以我们可以找出不满足的个数,用总的减去即可。

那么我们所要求的就是当前位置以前有几个点满足这个性质,可以用树状数组快速求出,维护三个树状数组即可。

我的做法稍特殊,首先在每个树状数组开始插一个$0$,然后我们只要求出小于等于$s_i-i$的个数即可。

时间复杂度:$\Theta(n\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n;
char ch[5000001];
int a[5000001];
int s[3][5000001];
int tr0[20000010],tr1[20000010],tr2[20000010];
long long ans;
int lowbit(int x){return x&-x;}
void add0(int x){for(int i=x;i<=10000000;i+=lowbit(i))tr0[i]++;}
int ask0(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))res+=tr0[i];
return res;
}
void add1(int x){for(int i=x;i<=10000000;i+=lowbit(i))tr1[i]++;}
int ask1(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))res+=tr1[i];
return res;
}
void add2(int x){for(int i=x;i<=10000000;i+=lowbit(i))tr2[i]++;}
int ask2(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))res+=tr2[i];
return res;
}
int main()
{
scanf("%d%s",&n,ch+1);
for(int i=1;i<=n;i++)
{
a[i]=ch[i]-'0';
s[a[i]][i]++;
s[0][i]+=s[0][i-1];
s[1][i]+=s[1][i-1];
s[2][i]+=s[2][i-1];
}
add0(5000001);
add1(5000001);
add2(5000001);
for(int i=1;i<=n;i++)
{
ans+=i;
ans-=ask0(2*s[0][i]-i+5000000);
ans-=ask1(2*s[1][i]-i+5000000);
ans-=ask2(2*s[2][i]-i+5000000);
add0(2*s[0][i]-i+5000001);
add1(2*s[1][i]-i+5000001);
add2(2*s[2][i]-i+5000001);
}
printf("%lld",ans);
return 0;
}

rp++

[CSP-S模拟测试]:斯诺(snow)(数学+前缀和+树状数组)的更多相关文章

  1. [CSP-S模拟测试]:降雷皇(DP+树状数组)

    题目描述 降雷皇哈蒙很喜欢雷电,他想找到神奇的电光.哈蒙有$n$条导线排成一排,每条导线有一个电阻值,神奇的电光只能从一根导线传到电阻比它大的上面,而且必须从左边向右传导,当然导线不必是连续的.哈蒙想 ...

  2. 【CSP模拟赛】奇怪的队列(树状数组 &二分&贪心)

    题目描述 nodgd的粉丝太多了,每天都会有很多人排队要签名.  今天有n个人排队,每个人的身高都是一个整数,且互不相同.很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来.同时nod ...

  3. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  4. BZOJ-2743: [HEOI2012]采花 前缀和 树状数组

    BZOJ-2743 LUOGU:https://www.luogu.org/problemnew/show/P4113 题意: 给一个n长度的序列,m次询问区间,问区间中出现两次及以上的数字的个数.n ...

  5. Gym - 101630G The Great Wall (前缀和+树状数组+二分)

    题意:有一个序列,一开始所有的元素都是ai,你可以选择两个长度相等的区间,如果某个元素被一个区间覆盖,那么变为bi,如果被两个区间都覆盖,那么变为ci.问所有区间的选择方法中产生的第k小的元素总和. ...

  6. HDU 3303 Harmony Forever 前缀和+树状数组||线段树

    Problem Description We believe that every inhabitant of this universe eventually will find a way to ...

  7. 「模拟赛20180307」三元组 exclaim 枚举+树状数组

    题目描述 给定 \(n,k\) ,求有多少个三元组 \((a,b,c)\) 满足 \(1≤a≤b≤c≤n\)且\(a + b^2 ≡ c^3\ (mod\ k)\). 输入 多组数据,第一行数据组数\ ...

  8. [CSP-S模拟测试]:Equation(数学+树状数组)

    题目描述 有一棵$n$个点的以$1$为根的树,以及$n$个整数变量$x_i$.树上$i$的父亲是$f_i$,每条边$(i,f_i)$有一个权值$w_i$,表示一个方程$x_i+x_{f_i}=w_i$ ...

  9. [CSP-S模拟测试]:小P的单调数列(树状数组+DP)

    题目描述 小$P$最近喜欢上了单调数列,他觉得单调的数列具有非常多优美的性质.经过小$P$复杂的数学推导,他计算出了一个单调增数列的艺术价值等于该数列中所有书的总和.并且以这个为基础,小$P$还可以求 ...

随机推荐

  1. VSphere随笔 - vCenter6.5安装配置手册

    一.前期准备: 1.物理机准备 一台已安装了ESXI虚拟化系统的机器: 2.DNS服务器准备 新建一台DNS服务器,添加vcenter的双向解析. (1)安装一台win2008的机器 (2)开启DNS ...

  2. 进程管理工具-Supervisord 使用

    简介 Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动.重启(自动重启程序).关闭进程(不仅仅是 Pytho ...

  3. Red Hat 6网络配置笔记

    1.重启网卡/etc/init.d/network restart server network restart2.运行结果报错 关闭NetworkManagerservice NetworkMana ...

  4. day 90 RBAC

    参考博客 -陈晓梅 http://www.cnblogs.com/c-x-m/p/9025478.html 登录view from django.shortcuts import render,red ...

  5. Java + selenium 元素定位(3)之By TagName

    本篇介绍findElement接口中的By TagName方法.首先,要知道什么是tagname.之前我们使用F12开发者工具查看网页元素是,发现每行代码前都有<input>.<bo ...

  6. T1219:马走日

    [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. [输入] 第 ...

  7. Python 中类和实例的通俗讲解

    本文为转载整理,我转过来作为备份留作自己查看,请点击链接阅读原文.原文链接为:点此 Python类与实例的讲解,相当通俗易懂.非常推荐! class Person: 注意,类的名称一般用大写字母开头, ...

  8. 购物车1.0版——python第5天

    # 输出商品列表,用户输入序号,显示选中商品名称# 商品li = ['手机', '电脑', '耳机', '键盘', '鼠标']# 要求:1.页面显示序号+商品名称如下# 1 手机# 2 电脑# 3 耳 ...

  9. UVA1608_Non-boring sequences

    Non-boring sequences 大致题意: 给你一个字符串,问你他的任一子串是否都包含一个唯一的字符 思路: 看似简单,实际一丁点思路都没有 后面看汝佳的讲解都看了好长时间 大概思路就是,先 ...

  10. css浮动以及清除

    首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...