給出1~n的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是b。中位數是指把所有元素從小到大排列後,位於中間的數。
輸入格式:
第一行為兩個正整數n和b,第二行為1~n的排列。
輸出格式:
輸出乙個整數,即中位數為b的連續子串行個數。
輸入樣例1:
7 4
5 7 2 4 3 1 6
輸出樣例1:【資料規模】
對於30%的資料中,滿足n≤100;
對於60%的資料中,滿足n≤1000;
對於100%的資料中,滿足n≤100000,1≤b≤n。
1 -> 比中位數大
-1 -> 比中位數小
0 -> 找到中位數!標記pos
還是舉個例項吧……
陣列:1 1 -1 -1 -1 pos 1 -1 1
這時的 sum 陣列:-1 -2 -3 -2 -1
這時的 f 陣列:f [ -1 + key ] = 2 ; f [ -2 + key ] = 2 ; f [ -3 + key ] = 1 ;
從 pos 向右
1. sum=1 -> 左邊 sum=-1 -> 兩次 ∴ ans+=2;
sum=0 -> 左邊 sum=0 -> 無
sum=1 -> 左邊 sum=-1 -> 兩次 ∴ ans+=2;
c++ **如下:
#include //標頭檔案
#include //標頭檔案
using
namespace
std;//命名空間
#define key 100001//定義乙個足夠大的數
int n,b,pos,a[100010],flag[100010],f[200010],s,ans;
int main()
for(int i=pos-1;i>=1;i--)
s=0;//為第三次迴圈的累加做準備
for(int i=pos+1;i<=n;i++)
printf("%d\n",++ans);//還少一次只由 pos 自己組成的連續子串行(也滿足條件!)
return
0;}
題解 中位數
傳送門 首先考慮的是二叉搜尋樹,每次查詢當前排名 i 1 2的數。但是對於某些資料,其遞迴層數過多,會導致爆棧。那麼顯然可以用treap或splay。這裡考慮線段樹 由於線段樹是一種平衡樹,所以一定保證能跑出來。對於線段樹,我們基於二叉搜尋樹的查詢方法並介於線段樹平衡的性質求解。對於線段樹的每乙個節...
洛谷 P1627 中位數
原題 考場想到了正解,但是依舊選擇了暴力,這究竟是天意,還是人覺啊!為了表示內心的惋惜與痛卻,還寫什麼解題思路啊!找到指定數的位置,算一遍字首和 如果a i include include include include include include include include include...
中位數題解 c (詳細)
題目是這樣的 題目描述 給你n個整數ai和乙個整數s,題目資料保證n是奇數。1次操作可以使n個數中的任意乙個數增加1或者減少1。你現在的任務是計算出使這n個整數的中位數變為s的最小運算元是多少?輸入格式 輸入一共有兩行。第一行有兩個整數n和s,分別表示整數的個數和題目描述的s的值 第二行包含n個用空...