51nod 1682 中位數計數(字首和)

2021-08-07 03:31:46 字數 1405 閱讀 6296

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

output示例

1 2 3 2 1

joe(題目提供者)

c++的執行時限為:1000 ms ,空間限制為:131072 kb 

示例及語言說明請按這裡

允許其他 ac 的使用者檢視此**,分享**才能檢視別人的**並有機會獲得勳章

題解:一開始用了很煩的n^2的方法,a了這道題,後來發現利用字首和便能很容易搞掉這道題,我們可以定義乙個sum陣列,用來統計字首和,統計誰的字首和呢,我們假設列舉到當前第i個數字,令比這個數大的數為1,比它小的數為-1,相等則為0,然後統計一發字首和,前邊的可以o(n)求出,後邊可以o(1)查詢,總複雜度為o(n^2)...

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;          

typedef long long ll;

#define inf 1000000000

#define mod 1000000007

#define maxn 8050

#define lowbit(x) (x&-x)

#define eps 1e-9

int ans[maxn],sum[maxn],a[maxn],num[maxn*3];

int main(void)

{ int n,i,j,tmp;

scanf("%d",&n);

for(i=1;i<=n;i++)

scanf("%d",&a[i]);

for(i=1;i<=n;i++)

{ tmp=sum[0]=0;

memset(num,0,sizeof(num));

num[maxn]++;

for(j=1;j<=n;j++)

{ if(a[j]

51Nod 1682 中位數計數

acm模版 這裡,我們可以分析得到,符合規則的區間有四種形式,分別是 i 1 j i 2 i j 3 j i j 4 而這裡,第一種不用過多處理,就是1 第2種和第3種類似,所以,我們需要求出來i之前的num的匹配情況,和i之後的num的匹配情況 而第四種要求的是,在第2種和第3種的基礎上,進行匹配...

51NOD 1682 中位數計數

1682 中位數計數 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 收藏 關注 中位數定義為所有值從小到大排序後排在正中間的那個數,如果值有偶數個,通常取最中間的兩個數值的平均數作為中位數。現在有n個數,每個數都是獨一無二的,求出每個數在多少個包含其的區間中是中...

51Nod 1682 中位數計數

中位數定義為所有值從小到大排序後排在正中間的那個數,如果值有偶數個,通常取最中間的兩個數值的平均數作為中位數。現在有n個數,每個數都是獨一無二的,求出每個數在多少個包含其的區間中是中位數。input 第一行乙個數n n 8000 第二行n個數,0 每個數 10 9 output n個數,依次表示第i...