也是神奇的题目。。

原题传送门

首先看到这道题目,很明显我们需要线性算法

1、前缀和+统计

2、DP+统计

对于第一种算法,我们可以对于任何一个a[i]对b进行比较,如果大于b标上1,等于b标上0,小于b标上-1;

以0为中介,前缀和前后展开统计答案即可。。学长的神奇做法,不讲。。

第二种算法啊,,

其实和第一种算法差不多

首先我们找到中位数b

对其左边和右边进行搜索

对于右边if(a[i]>a[i-1])f[i]=f[i-1]+1;else f[i]=f[i-1]-1;

左边同上,不过i-1改为i+1。。(水~)

然后我们很快会想到如果我们发现f[a[p](a[p]=b)]=f[i]=0时,答案肯定要+1。。这个很好理解吧。。

那么我们发现其实中位数序列的起点或终点不一定一定是a[p]

所以我们再对于每一次出现的f[i]做一下统计

即if(f[i])tot[0][0][f[i]]++;else tot[0][1][-f[i]]++;(统计另一边的时候要写成f[i]>=0!注意!这非常重要!,因为前段的0归为负数,后端的0就要归为正数!,否则统计会出错!)

第一个维度是记录在a[p]左还是右边,第二个维度是记录是否为负数。。由于C++没有负数数组,所以不加会RE。

然后判断的时候如果发现(tot[0][0][i]&&tot[1][1][i])||(tot[0][1][i]&&tot[1][0][i])

显然我们的答案就是左边端点数*右边端点数

然后就是代码啦!

#include<iostream>
#include<cstdio>
using namespace std;
int n,b,now;
unsigned long long ans;
int a[];
int f[];
int cnt[][][];
int main(){
freopen("median.in","r",stdin);
freopen("median.out","w",stdout);
scanf("%d%d",&n,&b);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==b)now=i;
}
for(int i=now+;i<=n;i++)
{
if(a[i]>b)f[i]=f[i-]+;
else f[i]=f[i-]-;
if(f[i]>=)cnt[][][f[i]]++;
else cnt[][][-f[i]]++;
}
for(int i=now-;i>=;i--)
{
if(a[i]>b)f[i]=f[i+]+;
else f[i]=f[i+]-;
if(f[i]>)cnt[][][f[i]]++;
else cnt[][][-f[i]]++;
}
for(int i=;i<=n;i++)if(f[i]==)ans++;
for(int i=;i<=n-;i++)
{
if(cnt[][][i]&&cnt[][][i])ans+=cnt[][][i]*cnt[][][i];
if(cnt[][][i]&&cnt[][][i])ans+=cnt[][][i]*cnt[][][i];
}
printf("%lld\n",ans);
fclose(stdin);
fclose(stdout);
}

median(NOIP模拟赛Round 3)的更多相关文章

  1. 水(NOIP模拟赛Round #10)

    题目描述: 小Z有一个长度为的数列.他有次令人窒息的操作,每次操作可以使某个数字或.他当然是希望这些数字的乘积尽量小了.为了简化题目,你只需输出操作完成后的数列即可. ———————————————— ...

  2. 小红帽的画笔(NOIP模拟赛Round 7)

    又到了神奇的模拟赛时间~ 真是丧~ 好吧我们来看看题目 小红帽是Pop star上最著名的人类画家,她可以将任何画出的东西变成真实的物品.赋予她这样神奇能力的正是她手上的画笔. 小红帽每次作画时,都需 ...

  3. YYH的营救计划(NOIP模拟赛Round 6)

    题目描述 “咚咚咚……”“查水表!”原来是查水表来了,现在哪里找这么热心上门的查表员啊!YYH感动的热泪盈眶,开起了门…… YYH的父亲下班回家,街坊邻居说YYH被一群陌生人强行押上了警车!YYH的父 ...

  4. 题(NOIP模拟赛Round #10)

    题目描述: 有一张的地图,其中的地方是墙,的地方是路.有两种操作: 给出个地点,询问这个地点中活动空间最大的编号.若询问的位置是墙,则活动空间为:否则活动空间为询问地点通过四联通能到达的点的个数.如果 ...

  5. 大(NOIP模拟赛Round #10)

    题目描述: 小Z有个n个点的高清大图,每个点有且只有一条单向边的出边.现在你可以翻转其中的一些边,使他从任何一个点都不能通过一些道路走回这个点.为了方便,你只需输出方案数对取模即可.当在两个方案中有任 ...

  6. bananahill(NOIP模拟赛Round 8)

    题目描述 香蕉川由座香蕉山组成,第i座山有它的高度.小Z准备从左到右爬这里的恰好座香蕉山,但他不希望山的高度起伏太大,太过颠簸,会让本就体育不好的他过于劳累.所以他定义了爬山的劳累度是所有爬的相邻的两 ...

  7. 战斗机的祈雨仪式(NOIP模拟赛Round 7)

    [问题描述] 炎炎夏日,如果没有一场大雨怎么才能尽兴?秋之国的人民准备了一场祈雨仪式.战斗机由于拥有操纵雷电的能力,所以也加入了其中,为此,她进行了一番准备. 战斗机需要给自己的Spear of Lo ...

  8. 魔法使的烟花(NOIP模拟赛Round 7)

    [问题描述] 魔法森林里有很多蘑菇,魔法使常常采摘它们来制作魔法药水.为了在6月的那个奇妙的晚上用魔法绽放出最绚丽的烟花,魔法使决定对魔法森林进行一番彻底的勘探. 魔法森林分为n个区域,由n-1条长度 ...

  9. 灰姑娘的水晶鞋(NOIP模拟赛Round 7)

    [问题描述] 传说中的水晶鞋有两种颜色:左边的水晶鞋是红色,右边的是蓝色,据说穿上它们会有神奇的力量. 灰姑娘要找到她所有的n双水晶鞋,它们散落在一条数轴的正半轴上,坐标各不相同,每双水晶鞋还有一个权 ...

随机推荐

  1. Urllib库:python内置的http请求库

    1.四个模块: request error parse robotparser 2.urlopen(url, data, timeout) 发送请求 get请求无data: post请求有data 3 ...

  2. B1018 锤子剪刀布 (20分)

    B1018 锤子剪刀布 (20分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势. 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. ...

  3. 基于pandas进行数据预处理

    很久没用pandas,有些有点忘了,转载一个比较完整的利用pandas进行数据预处理的博文:https://blog.csdn.net/u014400239/article/details/70846 ...

  4. 十三、MySQL之IDE工具介绍及数据备份

    一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 # ...

  5. WPF制作的小时钟

    原文:WPF制作的小时钟 周末无事, 看到WEB QQ上的小时钟挺可爱的, 于是寻思着用WPF模仿着做一个. 先看下WEB QQ的图: 打开VS, 开始动工. 建立好项目后, 面对一个空荡荡的页面, ...

  6. Pytest框架介绍

    Pytest框架介绍.安装 pytest是python测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,功能更强大 pytest特征 1:断言提示信 ...

  7. python负数除法与模运算

    1.负数除法: >>> print 45/76>>> print -45/7-7 >>> print 45/-7-7 >>> p ...

  8. [译]8-spring bean的作用域

    在spring中使用<bean/>标签定义bean的时候,可以使用scope属性来定义bean的作用域.如果想要每次 从spring容器得到一个新创建的bean实例,可以指定scope=& ...

  9. [转]unity之LOD

    LOD技术有点类似于Mipmap技术,不同的是,LOD是对模型建立了一个模型金字塔,根据摄像机距离对象的远近,选择使用不同精度的模型. 它的好处是可以在适当的时候大量减少需要绘制的顶点数目. 它的缺点 ...

  10. cloud-utils

    官方下载:https://launchpad.net/cloud-utils rpm包下载地址:http://rpmfind.net/linux/rpm2html/search.php?query=c ...