51nod 1682 中位數計數 想法題

2021-07-27 15:59:29 字數 1565 閱讀 8480

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

現在有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

這題看錯n的範圍了,以為是6000(因為剛做了乙個6000的題)….t_t…..

然後想也沒想就以為是主席樹模板題了,列舉每個區間,然後主席樹找這個區間中位數。結果t了,時間複雜度是o(n^2logn),難道卡常數?

然後看了討論,囧,原來看錯資料範圍了~~

正解是列舉每個數作為中位數x,那麼這比這個數大的和比這個數小的數的數目是一樣的。所以找這個中位數x所在的區間,那麼對於這個數左邊,統計》x和

#include 

using

namespace

std;

typedef

long

long ll;

const

int n = 2e5;

int a[n], num[n], ans[n];

int main()

cnt = 0;

for (int j = i; j <= n; j++)

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

printf("%d%c", ans[i], i == n ? '\n' : ' ');

return

0;}

t的**:

#include 

using

namespace

std;

const

int maxn = 1e4;

struct node ;

node t[maxn * 20];

int t_cnt;

void insert(int &num, int &x, int l, int r)

int query(int i, int j, int k, int l, int r)

struct a

};a a[maxn];

int rk[maxn], root[maxn],num[maxn];

int n, m;

int main()

sort(a + 1, a + n + 1);

for(int i = 1; i <= n; ++i) rk[a[i].idx] = i;

t_cnt = 1;

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

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

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

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

return

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

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