BZOJ 1303: [CQOI2009]中位数图

2024-01-03 13:18
文章标签 bzoj 中位数 cqoi2009 1303

本文主要是介绍BZOJ 1303: [CQOI2009]中位数图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1303: [CQOI2009]中位数图

Time Limit: 1 Sec   Memory Limit: 162 MB
Submit: 3297   Solved: 2033
[ Submit][ Status][ Discuss]

Description

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

Input

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

Output

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

Sample Input

7 4
5 7 2 4 3 1 6

Sample Output

4

HINT

第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}
N<=100000

Source


【思路】

    前缀和问题,  连续子序列, 中位数,  瞬间降低了难度,     大于 赋值为1  小于 赋值为-1   等于赋值为 0

    又Sum[r]=Sum[l-1]   ans++;

    处理  有可能会有小于0 的情况  故  加 个n  

【代码】


/*
* Date: 4/1/2018
* Tile: 1303
* AU: SIZ
* Cate: 思维,前缀和
* WA:3
*/#include <iostream>
#include <bits/stdc++.h>
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;
using namespace std;
int a[MAXN];
int sum[MAXN];
map<int,int>mp;
int main()
{mp.clear();int n;int b;memset(sum,0,sizeof(sum));cin>>n>>b;for(int i=1;i<=n;i++){cin>>a[i];}int p=-1;for(int i=1;i<=n;i++){if(a[i]==b)a[i]=0,p=i;elsea[i]=(a[i]>b?1:-1);sum[i]=sum[i-1]+a[i];if(p==-1)mp[sum[i]+n]++;}mp[n]++;int ans=0;for(int i=p;i<=n;i++){//    cout<<sum[i]<<" "<<mp[sum[i]+n]<<endl;ans+=mp[sum[i]+n];}cout<<ans<<endl;return 0;
}

123


这篇关于BZOJ 1303: [CQOI2009]中位数图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/565818

相关文章

【BZOJ】1324 Exca王者之剑 最大权独立集

传送门:【BZOJ】1324  Exca王者之剑 题目分析:赤裸裸的最大权独立集。。。最小割解决 代码如下: #include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std ;#define REP( i , a , b ) for ( int

【BZOJ】1026: [SCOI2009]windy数 数位DP

传送门:【BZOJ】1026: [SCOI2009]windy数 题目分析:数位DP水题。 代码如下: #include <stdio.h>#include <cstring>#include <algorithm>#define rep( i , a , b ) for ( int i = a ; i < b ; ++ i )#define For( i ,

【SGU】 114. Telecasting station 中位数

传送门:【SGU】 114. Telecasting station 题目分析:一个位置多个城市可以看成多个城市在同一位置,然后就可以求中位数了,易知最优的位置一定在中位数上。 代码如下 : #include <map>#include <vector>#include <cstdio>#include <cstring>#include <iostream>

【BZOJ】2152: 聪聪可可 点分治

传送门:【BZOJ】2152: 聪聪可可 题目分析:记录权值和%3的路径的个数。。。然后去重。。没了。。 代码如下: #include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std ;typedef lo

算法/编程练习:两个有序数组的中位数

算法/编程练习:两个有序数组的中位数 题目来自LeetCode: https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目: 给定两个大小为 n1 和 n2 的有序(升序)数组 nums1 和 nums2 ,找出这两个有序数组的中位数mid。要求算法的时间复杂度为 O(log(m + n))。例如,输入: nu

SQL进阶技巧:给定数字的频率查询中位数 | 中位值计算问题

目录 0 需求描述 1 数据准备 2 问题分析 方法1:按照频率将num值展开,转换成明细表,利用中位值公式 求解      abs(rn - (cnt+1)/2) < 1  方法2:中位值定义 3 小结 0 需求描述 num表: Column NameTypenumintfrequencyint num 是这张表的主键(具有唯一值的列)。这张表的每一行表示某个数字

算法--------------------寻找两个有序数组的中位数

题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/

leetcode 4:两个排序数组的中位数

寻找中位数,当m+n是奇数时,中位数为第(m+n+1)/2个数,当m+n为偶数时,中位数为第(m+n+1)/2和(m+n+2)/2的平均数 根据整数的取整,我们可以统一为中位数为第(m+n+1)/2和(m+n+2)/2的平均数。 如何使用二分法求两个有序数组的第k个数 首先将数组A和数组B分为left_A(下标为0~k/2-1),right_A,left_B(下标为0~k/2-1),ri

NumPy(五):数组统计【平均值:mean()、最大值:max()、最小值:min()、标准差:std()、方差:var()、中位数:median()】【axis=0:按列运算;axis=0:按列】

统计运算 np.max()np.min()np.median()np.mean()np.std()np.var()np.argmax(axis=) — 最大元素对应的下标np.argmin(axis=) — 最小元素对应的下标 NumPy提供了一个N维数组类型ndarray,它描述了 相同类型 的“items”的集合。(NumPy provides an N-dimensional array

opencv中求图像像素值中位数

话不多说,直接上源码: int GetMidValue(Mat& input){int rows = input.rows;int cols = input.cols;float histogram[256] = { 0 };//先计算图像的直方图for (int i = 0; i < rows; ++i){///获取i行首像素的指针const uchar *p = input.ptr<uch