中位數定義為所有值從小到大排序後排在正中間的那個數,如果值有偶數個,通常取最中間的兩個數值的平均數作為中位數。
現在有n個數,每個數都是獨一無二的,求出每個數在多少個包含其的區間中是中位數。
收起
第一行乙個數n(n<=8000)第二行n個數,0<=每個數<=10^9
n個數,依次表示第i個數在多少包含其的區間中是中位數。
51 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...