CQOI2009中位数

2024-04-10 04:08
文章标签 中位数 cqoi2009

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

                          CQOI2009中位数

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

 

输入格式:

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

 

输出格式:

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

 

样例输入:

5 4
1 2 3 4 5
-----------
6 3
1 2 4 5 6 3
-----------
7 4
5 7 2 4 3 1 6

 

样例输出:

5
-----------
1
-----------
4

 

数据范围:

编号 1 2 3 4 5 6 7 8 9 10
N 10 50 100 300 1000 3600 10000 25000 55555 100000

 

时间限制:

2000

 

空间限制:

512000

 

提示:

第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}。

解析:把比中位数小的改为-1,自己为0,比它大的为1,在爆枚后用乘法原理。

#include<bits/stdc++.h>
using  namespace  std;
#define N 100001
#define PER(i,a,b) for(int i=a;i<=b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
int  n;
int  a[N];
int  hz1[N],hz2[N];
int  hy1[N],hy2[N];
int  let[N];
int  b,wei,ans;
int  main()
{
     cin>>n>>b;
     PER(i,1,n)
     {
         cin>>a[i];
         if (a[i]<b)let[i]=-1;
         else  if (a[i]==b)
         {
             let[i]=0;
             wei=i;
         }
         else  let[i]=1;
     }
     int  cnt=0;
     REP(i,wei,1)
     {
         cnt+=let[i];
         if (cnt>=0) hz1[cnt]++;
         else  hz2[ abs (cnt)]++;
     }
     cnt=0;
     PER(i,wei,n)
     {
         cnt+=let[i];
         if (cnt>=0) hy1[cnt]++;
         else  hy2[ abs (cnt)]++;
     }
     ans+=hy1[0]*hz1[0];
     PER(i,1,n)
     {
         ans+=hy1[i]*hz2[i];
         ans+=hy2[i]*hz1[i];
     }
     cout<<ans;
}

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



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

相关文章

【SGU】 114. Telecasting station 中位数

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

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

算法/编程练习:两个有序数组的中位数 题目来自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

查找有序二维数组的中位数

题目:给定 n×n 的实数矩阵,每行和每列都是递增的,求这 n^2 个数的中位数 代码如下: package com.cb.java.algorithms.programmingmethod.search;/*** 给定 n×n 的实数矩阵,每行和每列都是递增的,求这 n^2 个数的中位数* * @author 36184**/public class SearchMedian {/***

第四题:求两个有序数组的中位数(Median of Two Sorted Arrays)

题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2,请你找出这两个有序数组的中位数。 示例: 输入:nums1 = [1, 3], nums2 = [2] 输出:2.0 输入:nums1 = [1, 2], nums2 = [3, 4] 输出:2.5 要求: 你必须在对数时间复杂度 O(log(min(m, n))) 内解决这个问题。 解题思路 二分

排序算法刷题【leetcode:04题,寻找两个正序数组的中位数。leetcode:219题,存在重复的元素 】

代码如下所示: #include <iostream>#include <vector>#include <algorithm>using namespace std;/* leetcode04题:寻找两个正序数组的中位数 */class Solution {public:double findMedianSortedArrays(vector<int>& nums1, vec