51nod 1682 中位數技術 字首和

2021-08-21 13:46:06 字數 819 閱讀 1021

問在給出序列中每個元素在包含他的區間中作為中位數的次數

顯然有n^2logn的方法,然後卡到窒息

看了別人的

就用一種類似字首計數的方法

bg[i] 到i大於的

sm[i] 小於的

bg[r]-bg[l]=sm[r]-sm[l]

=>

bg[r]-sm[r] = bg[l]-sm[l]

注意細節即可

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define debug(x) //std::cerr << #x << " = " << (x) << std::endl

typedef

long

long ll;

const

int maxn = 8e3 + 17;

const

int mod = 1e9 + 7;

int a[maxn],ans[maxn],sm[maxn],bg[maxn],ocr[100000+10000];

int main(int argc, char

const *argv)

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

}for (int i = 0; i < n; ++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 中位數計數

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