Description


给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。

Input


第一行为两个正整数n和b,第二行为1~n的排列。

【数据规模】

对于30%的数据中,满足n≤100;

对于60%的数据中,满足n≤1000;

对于100%的数据中,满足n≤100000,1≤b≤n。

Output


输出一个整数,即中位数为b的连续子序列个数。

Sample Input


7 4
5 7 2 4 3 1 6

Sample Output


4

题解


因为这道题不关心数据具体为多少,只关心每个数比b大或小,
所以首先在读入的时候就忽视数据绝对大小,只存相对b的大小
(小于b存-1 等于b存0 大于b存1

O(n^2):
枚举区间长度L和左端点i 利用前缀和可以O(1)得到区间和 易知区间和为0的话在这个区间内b为中位数
(证明:因为区间和为0 所以在这个区间内的-1数量和1的数量相等 也就是比b小的和比b大的数一样多)

期望60,却因为数据巨水搞到90(喵喵喵?)

本来打算卡一波常A掉然后发n方题解哈哈哈哈

90分代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
inline int read()
{
char ch=getchar();
int x=0;bool s=1;
while(ch<'0'||ch>'9'){if(ch=='-')s=0;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return s?x:-x;
}
int a[100007];
int s[100007];
int main()
{
//scan
int n,mid,p;
n=read(),mid=read();
unsigned long long ans=0;
for(int i=1;i<=n;++i)
{
int x=read();
if(x<mid)a[i]=-1;
else if(x>mid)a[i]=1;
else p=i;
}
for(int i=1;i<=n;++i)
s[i]=s[i-1]+a[i];
//run
for(int l=1;l<=n;l+=2)
{
int k=min(p,n-l+1);
for(int i=max(1,p-l+1);i<=k;++i)
{
int j=i+l-1;
if(s[j]-s[i-1]==0)ans++;
}
}
cout<<ans<<endl;
return 0;
}

AC做法:(先懵着脑袋看 后有讲解)

读入的同时记录b出现的坐标为p。从p-1到1扫一遍,从p+1到n扫一遍,用类计数排序的方式记录 ↓

int s=0;
for(int i=p-1;i;--i){
s+=a[i];
L[s+c]++;//c=100001 避免负坐标
}
s=0;
for(int i=p+1;i<=n;++i){
s+=a[i];
R[s+c]++;
}

L[ s + c ]表所有左端点为1到p-1,右端点为p-1的区间中,区间和为s的情况数
同理R[ s + c ]表所有左端点为p+1,右端点为p+1到n的区间中,区间和为s的情况数

而对于一个区间< l , r >,如果< l , p-1 >的区间和 + < p+1 , r >的区间和==0的话,就是一个符合条件的区间。
所以根据乘法原理,L[ s + c ] × R[ ( - s ) + c ] == p左边的区间和为s时的所有可能情况(此时右边区间和为-s)所以

ans+=L[ s + c ] × R[ ( - s ) + c ] ( s = - n to n ) ;

最后因为以上只计算了 l < p 且 r > p 的区间,所以还要

ans+=L[ 0 + c ]  (l<p r==p) +R[0+c] (l==p r>p) +1(l==p r==p);

AC代码:

#include<iostream>
#include<cstdio>
using namespace std;
#define R register
inline int read()
{
char ch=getchar();
int x=0;bool s=1;
while(ch<'0'||ch>'9'){if(ch=='-')s=0;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return s?x:-x;
}
int a[100007],l[200007],r[200007];
int main()
{
//scan
int n=read(),b=read(),p;
for(R int i=1;i<=n;++i)
{
int x=read();
if(x<b)a[i]=-1;
else if(x>b)a[i]=1;
else p=i;
}
//predo
int s=0,c=100001;
for(R int i=p-1;i;--i)
{
s+=a[i];
l[s+c]++;
}
s=0;
for(R int i=p+1;i<=n;++i)
{
s+=a[i];
r[s+c]++;
}
//run
int ans=0;
for(R int i=-n;i<=n;++i)
{
ans+=l[i+c]*r[-i+c];
}
ans+=l[0+c]+r[0+c]+1;
cout<<ans<<endl;
return 0;
}

「LuoguP1627 / T36198」 [CQOI2009]中位数的更多相关文章

  1. 「国家集训队」middle

    「国家集训队」middle 传送门 按照中位数题的套路,二分答案 \(mid\),序列中 \(\ge mid\) 记为 \(1\),\(< mid\) 的记为 \(-1\) 然后只要存在一个区间 ...

  2. 「POJ 3666」Making the Grade 题解(两种做法)

    0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...

  3. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

  4. BZOJ 1303 CQOI2009 中位数图 水题

    1303: [CQOI2009]中位数图 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2340  Solved: 1464[Submit][Statu ...

  5. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

  6. 更新日志 - fir.im「高级统计」功能上线

    距离 2016 年到来只剩 10 个日夜,fir.im 也准备了一些新鲜的东西,比如「高级统计」功能和「跳转应用商店」功能,帮助你更好地管理.优化应用,欢迎大家试用反馈:) 新增高级统计功能 这次更新 ...

  7. Notepad++ 开启「切分窗口」同时检视、比对两份文件

    Notepad++ 是个相当好用的免费纯文本编辑器,除了内建的功能相当多之外,也支持外挂模块的方式扩充各方面的应用.以前我都用 UltraEdit 跟 Emeditor,后来都改用免费的 Notepa ...

  8. 「zigbee - 1」工欲善其事必先利其器 - IAR for 8051 IDE customization

    最近在实验室做一些 Zigbee 相关的事情,然而一直没在博客上记录啥东西,也不像原来在公司有动力在 Confluence wiki 上扯东扯西.直到前些阵子,跑到 feibit 论坛上(国内较大的一 ...

  9. 「C语言」文件的概念与简单数据流的读写函数

    写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实, ...

随机推荐

  1. ssh的安装和使用

    1.ssh的安装 服务器端:sudo apt-get install openssh-serve 客户端:sudo apt-get install openssh-client 2.ssh的操作 查看 ...

  2. Credit Memo和Debit Memo在AR以及AP中的概念比较

    AR和AP中都有Credit Memo和Debit Memo的概念, 但是其含义和用法完全不一样,比较难懂,现在整理如下:AR中的CreditMemo和DebitMemo是和客户打交道:AR中的Cre ...

  3. 【Discuz】ucenter通讯失败与Discuz的头像无法显示

    假设是Discuz论坛的一些小样式图片.仅仅须要升级一下Discuz论坛的论坛或者,直接把整个网站的css的首域名替换一下.比方将127.0.0.1:8080/..开头的东西全改成127.0.0.1: ...

  4. hdu 1710 Binary Tree Traversals 前序遍历和中序推后序

    题链;http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (J ...

  5. NS3网络仿真(7): Wifi节点

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中.我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP.再连上几个节点 ...

  6. 数据存储 --《高性能JavaScript》

    1.数据存储的方式 1.字面量 2.变量 3.数组项 4.对象成员 2.各自的性能特点 1.访问字面量和局部变量的速度最快,访问数组项和对象成员相对较慢 2.由于局部变量在作用域链的起始位置,因此访问 ...

  7. W5500EVB TCP Server演示

    之前给大家展示了p=6471" style="margin:0px; padding:0px; border:0px; font-family:inherit; font-size ...

  8. TestNG – Dependency Test

    转自:http://www.mkyong.com/unittest/testng-tutorial-7-dependency-test/ In TestNG, we use dependOnMetho ...

  9. org.hibernate.id.IdentifierGenerationException错误解决方法

    org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before ...

  10. fatal error C1083: 无法打开预编译头文件:“Debug\opencv.pch”: No such file or directory

    stdafx.cpp右键——属性,预编译头选“创建”,其它cpp选“使用”. 调试不能优化.