「LuoguP1627 / T36198」 [CQOI2009]中位数

这道题目要求求解1~n排列中,长度为奇数的连续子序列,其中位数为b的个数。输入包括排列和中位数b,通过计算相对b的大小来简化问题,利用前缀和在O(n^2)时间内找到符合条件的子序列个数。提供的样例输入和输出展示了具体操作,并提到原本预期60分的解决方案在实际测试中得到了90分。
摘要由CSDN通过智能技术生成

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>=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值