HDU5701 中位數計數

2021-09-29 01:45:33 字數 907 閱讀 9486

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

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

收起

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

第二行n個數,0<=每個數<=10^9

n個數,依次表示第i個數在多少包含其的區間中是中位數。
5

1 2 3 4 5

1 2 3 2 1
這道題分三種情況,這個點是這個區間的右端點,左端點,和在中間的情況,前兩種都好說,直接向前向後遍歷 即可,設定乙個變數cnt,每次遇到比自己大的數加一,比自己小的數減一,當cnt為0時這個區間滿足,答案加一即可,但是如果這個點是第三種情況的話,就需要用到乙個小技巧,向前遍歷時用乙個陣列記錄下出現的所有情況(即cnt的大小)的數量,向後遍歷時如果出現-cnt,那麼就加上這個情況的數量即可.

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

typedef long long ll;

typedef double ld;

using namespace std;

const int n=8000+100;

int a[n],ans[n];

int vis[20000];

int n,cnt;

int i,j,k;

int main()

cnt=0;

for(int j=i+1; j}

for(int i=0; icout

return 0;

}

HDU 5701 中位數計數

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

HDU 5701 中位數計數

這題n方可過,顯然滿足條件的區間必是含奇數個數的區間,對於每個數,先往右掃一遍,求得其右邊比其大的和比其小的數的個數的差x,然後再往 左掃一遍,求其左邊比起小的數和比起大的數的差,若乙個數在這個區間為 中位數,則若其右邊比它大的比比它小的多x 有點繞 則其左邊相反小的要 比大的多x,這樣x才能正好在...

HDU 5701 中位數計數

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