CQOI2009 中位數 字首和

2022-04-30 07:21:12 字數 1340 閱讀 1860

給出1~n的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是b。中位數是指把所有元素從小到大排列後,位於中間的數。

輸入格式:

第一行為兩個正整數n和b,第二行為1~n的排列。

【資料規模】

對於30%的資料中,滿足n≤100;

對於60%的資料中,滿足n≤1000;

對於100%的資料中,滿足n≤100000,1≤b≤n。

輸出格式:

輸出乙個整數,即中位數為b的連續子串行個數。

輸入樣例#1:

7 45 7 2 4 3 1 6

輸出樣例#1:

首先題目有乙個隱含的性質,因為是排列,而又保證\(b\)出現過,所以\(b\)在這\(n\)個數中有且只有乙個

這道題可以\(o(n^2)\)通過統計字首和拿到60分,我們只關心相對大小,所以可以把大於\(b\)的設成1,小於\(b\)的設成-1

因為是中位數,所以前後的數字個數必定相等,在我們設了1/-1之後,又多了乙個條件,即左邊的數字的和+右邊數字的和=0(想一想就知道了)

那麼我們就可以先統計一邊的字首和的個數,再在另一邊一邊計算字首和一邊統計答案,因為可能會有負數,所以有兩種方法,一種是把陣列平移,一種是開\(map\)

具體結合**(畫一下)就懂了

#include#define in(i) (i=read())

#define il extern inline

#define rg register

#define min(a,b) ((a)<(b)?(a):(b))

#define max(a,b) ((a)>(b)?(a):(b))

#define lol long long

using namespace std;

const lol n=1e5+10;

lol read()

while (i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+(i^48), i=getchar();

return ans*f;

}int n,m,sum,ans,pos,a[n];

mapcnt;

int main()

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

sum+=a[i], cnt[sum]++;

sum=0;

for (int i=pos;i>=1;i--)

sum+=a[i], ans+=cnt[-sum];

cout<

題解 CQOI2009 中位數

目錄分析 注意事項 code 執行限制 時間不超過 1.00 textrm 空間不超過 128 textrm 給出 1,2,cdots,n 的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是 b 中位數是指把所有元素從小到大排列後,位於中間的數。第一行為兩個正整數 n 和 b 第二行為 ...

洛谷P1627 CQOI2009 中位數

給出1 n的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是b。中位數是指把所有元素從小到大排列後,位於中間的數。第一行為兩個正整數n和b,第二行為1 n的排列。資料規模 對於30 的資料中,滿足n 100 對於60 的資料中,滿足n 1000 對於100 的資料中,滿足n 100000...

51nod 1682 中位數計數(字首和)

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