51nod 1682 中位数计数(前缀和)

51nod 1682 中位数计数

思路:

sum[i]表示到i为止的前缀和(比a[i]小的记为-1,相等的记为0,比a[i]大的记为1,然后求这些-1,0,1的前缀和);

hash[sum[i]+N](由于sum[i]会小于0,所以要加N)记录在j<i的情况下sum[i]是否出现过,如果在j>=i的情况下,sum[i]还出现过,那么就代表有一个区间满足条件。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mp make_pair
#define pi acos(-1.0)
#define pii pair<int,int>
#define pil pair<int,ll>
#define mem(a,b) memset(a,b,sizeof(a))

const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
const int N=8e3+5;
//head

int a[N];
int sum[N]={0};
int hash[N*2]={0};
int ans[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];

    for(int i=1;i<=n;i++)
    {
        int temp=0;
        mem(hash,0);
        hash[N]=1;
        for(int j=1;j<=n;j++)
        {
            if(a[j]<a[i])sum[j]=sum[j-1]-1;
            else if(a[j]==a[i])sum[j]=sum[j-1];
            else if(a[j]>a[i])sum[j]=sum[j-1]+1;
            if(j<i)hash[sum[j]+N]++;
            else temp+=hash[sum[j]+N];
        }
        ans[i]=temp;
    }

    for(int i=1;i<=n;i++)
    {
        cout<<ans[i];
        if(i!=n)cout<<" ";
        else cout<<endl;
    }
    return 0;
} 
时间: 2024-09-29 22:24:47

51nod 1682 中位数计数(前缀和)的相关文章

51nod 1682 中位数计数

1682 中位数计数基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数. Input 第一行一个数n(n<=8000) 第二行n个数,0<=每个数<=10^9 Output N个数,依次表示第i个数在多少包含其的区间中是中位数. Input示例 5 1 2 3 4 5

hdu-5701 中位数计数(中位数)

题目链接: 中位数计数 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有nn个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数. Input 多组测试数据 第一行一个数n(n≤8000) 第二行n个数,0≤每个数≤10?^9??, Output N个数,依次表示第ii个数在多少包含其的区间中是中位数. Sample Input 5 1 2 3 4 5 Sample Ou

HDU 5701 中位数计数( 2016&quot;百度之星&quot; - 初赛(Astar Round2B) 思维 + 暴力)

传送门 中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 852 Accepted Submission(s): 335 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含

hdu 5701 中位数计数 思路题

中位数计数 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 909    Accepted Submission(s): 346 Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包

51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线

 区间计数 基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80 两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{Ai,Ai+1,...,Aj}=max{Bi,Bi+1,...,Bj}] 注:[ ]内表达式为真,则为1,否则为0. 1≤N≤3.5×1051≤Ai,Bi≤N 样例解释: 7个区间分别为:(1,4),(1,5),(2,4),(2,5),(3,3),(3,5),(4,5) Input 第一行一个整数N 第二行

HDU - 5701 中位数计数

中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数. 现在有n个数,每个数都是独一无二的,求出每个数在多少个包含其的区间中是中位数. Input多组测试数据 第一行一个数n(n≤8000)n(n≤8000) 第二行nn个数,0≤0≤每个数≤109≤109,OutputNN个数,依次表示第ii个数在多少包含其的区间中是中位数.Sample Input 5 1 2 3 4 5 Sample Output 1 2 3 2 1 解法:对于每个数字

51nod 1222 最小公倍数计数【莫比乌斯反演】

参考:https://www.cnblogs.com/SilverNebula/p/7045199.html 所是反演其实反演作用不大,又是一道做起来感觉诡异的题 转成前缀和相减的形式 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}[\frac{i*j}{gcd(i,j)}\leq n] \] \[ \sum_{d=1}^{n}\sum_{i=1}^{\left \lfloor \frac{n}{d}\right \rfloor}\sum_{j=1}^{\left \lfloor

HDU 5701 中位数计数 暴力

老题了,附上黄学长链接一发,直接改改就AC了,http://hzwer.com/1216.html #include <cstdio> #include <iostream> #include <cstring> using namespace std; const int N=1e4+5; int num[N],sum[N],l[N*2],r[N*2],a[N]; int n; int get(int x){ int p,ans=0; memset(sum,0,siz

百度之星 hdu5701 中位数计数

http://acm.hdu.edu.cn/showproblem.php?pid=5701 给出一个序列,取其中的任何一个连续的序列,该序列的数从小到大排列,待更新,,, 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int MAXN = 8005; 6 int num[MAXN]; 7 int arr[MAXN]; 8 int su