51Nod 1682 中位數計數

2021-08-18 14:18:17 字數 1108 閱讀 5567

中位數定義為所有值從小到大排序後排在正中間的那個數,如果值有偶數個,通常取最中間的兩個數值的平均數作為中位數。

現在有n個數,每個數都是獨一無二的,求出每個數在多少個包含其的區間中是中位數。

input 第一行乙個數n(n<=8000)

第二行n個數,0<=每個數<=10^9 output n個數,依次表示第i個數在多少包含其的區間中是中位數。 sample input

5

1 2 3 4 5

sample output
1 2 3 2 1

a[i]是區間的中位數 即 區間內 大於a[i]的數的個數a = 小於a[i] 的數的個數b;

即 i 左邊的 a-b 的值 = i  右邊的 b - a 的值;

cnt 為 x-i 區間內 a - b 的值 (x∈[ 0 , i ));

對於每乙個 a[i],在 0 - i 求乙個 m 陣列;

m[cnt] 表示 [ 0 , i ) 內 a - b = cnt 的區間終點為i的區間起點個數;

初始化 m[0] =1,此區間只包含 a[i] ;

ans[i] 為 i 是中位數 區間的個數

遍歷[ i ,n ) 再算一遍 cnt 則此時的區間個數即 m[-1*cnt] ;

(我寫的 cnt 為 b - a ,則此時的區間個數為 m[cnt])

最後 ans[i] 求一遍和即可;

#include

#include

#include

#define ll long long

using

namespace

std;

ll a[8050];int ans[8050];

int m[16050];

intmain

() cnt=0;

for(int j=i;jif(a[j]>a[i]) cnt--;

else

if(a[j]8000];}}

for(int i=0;iif(i) printf(" ");

printf("%d",ans[i]);

}cout

0;}

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 中位數計數

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