中位數題解 luogu P1627

2021-08-15 03:48:41 字數 1097 閱讀 1574

給出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個用空...