給出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...