• P1627 中位数


    P1627 中位数

    题目描述

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

    输入输出格式

    输入格式:

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

    【数据规模】

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

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

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

    输出格式:

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

    输入输出样例

    输入样例#1:
    7 4
    5 7 2 4 3 1 6 
    输出样例#1:
    4

    分析

      首先大于b的设为1,小于b的设为-1,p点为b值的坐标。处理L数组和R数组,L[i]表示p左边有多少个点到p的和为i,R[i]表示p右边有多少个点到p的和为i,那么ans=Σ L[i]*R[0-i]。为了没有负数坐标,所以代码中统一加n。

    code

     1 #include<cstdio>
     2 
     3 int a[100100];
     4 int l[200100],r[200100],sum[100100];
     5 int read()
     6 {
     7     int x = 0, f = 1; char ch = getchar();
     8     for (; ch<'0'||ch>'9'; ch = getchar())
     9         if (ch=='-') f = -1;
    10     for (; ch>='0'&&ch<='9'; ch = getchar())
    11         x = x*10+ch-'0';
    12     return x*f;
    13 }
    14 int main()
    15 {
    16     int n = read(), d = read(), p,ans = 0;
    17     for (int x,i=1; i<=n; ++i) {
    18         x = read();
    19         if (d==x) p = i,a[i] = 0;
    20         else if (x<d) a[i] = -1;
    21         else a[i] = 1;
    22     }
    23     l[n] = r[n] = 1;
    24     for (int i=p-1; i>=1; --i) {
    25         sum[i] = sum[i+1]+a[i];
    26         l[sum[i]+n]++;
    27     }
    28     for (int i=p+1; i<=n; ++i) {
    29         sum[i] = sum[i-1]+a[i];
    30         r[sum[i]+n]++;
    31     }
    32     for (int i=0; i<=2*n-1; ++i) ans += l[i]*r[2*n-i];
    33     printf("%d",ans);    
    34     return 0;
    35 }

    乱搞70

     1 #include<cstdio>
     2 #include<algorithm>
     3 
     4 
     5 using namespace std;
     6 
     7 int a[10000100];
     8 
     9 int read()
    10 {
    11     int x = 0, f = 1; char ch = getchar();
    12     for (; ch<'0'||ch>'9'; ch = getchar())
    13         if (ch=='-') f = -1;
    14     for (; ch>='0'&&ch<='9'; ch = getchar())
    15         x = x*10+ch-'0';
    16     return x*f;
    17 }
    18 
    19 int main()
    20 {
    21     int n = read(), d = read(), p = -1, xcnt = 0, dcnt = 0,ans = 1;
    22     
    23     for (int i=1; i<=n; ++i) {
    24         a[i] = read();
    25         if (d==a[i]) p = i;
    26         if (p==-1) {
    27             if (a[i]<d) xcnt++;
    28             else dcnt++;
    29         }
    30     }
    31     int L = p,da = 0,xo = 0;
    32     for (int i=1; ; i+=2) {
    33         if (a[--L]>d) da++;else xo++;
    34         if (a[--L]>d) da++;else xo++;
    35         if (da==xo)    ans++;
    36         if (L==1||L==2) break;
    37     }
    38     
    39     for (int i=1; i<=p; ++i) {
    40         if (i!=1) {
    41             if (a[i-1]>d) dcnt--;
    42             else xcnt--;
    43         }
    44         da = dcnt,xo = xcnt;
    45         for (int j=p+1; j<=n; ++j) {
    46             if (a[j]>d) da++;else xo++;
    47             if (da==xo) ans++;
    48         }    
    49     }
    50     
    51     printf("%d",ans);
    52         
    53     return 0;
    54 }
    View Code
  • 相关阅读:
    MySQL日志概述
    MySQL事务概述
    MySQL存储引擎
    Linux软件安装,RPM与YUM
    使用PuTTY在Windows中向Linux上传文件
    Linux网络基础
    Java正则表达式实例详解
    Javascript正则构造函数与正则表达字面量&&常用正则表达式
    常用sql语句及案例(oracle)
    oracle数据导入/导出(2)
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7502301.html
Copyright © 2020-2023  润新知