国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【BZOJ 1303】 【CQOI2009】中位數圖

2019-11-08 02:25:38
字體:
來源:轉載
供稿:網友

Description

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

Input

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

Output

輸出一個整數,即中位數為b的連續子序列個數。

Sample Input

7 4 5 7 2 4 3 1 6

Sample Output

4

HINT

第三個樣例解釋:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6} N<=100000

題解

這道題蠻好玩的,有點燒腦。

對于小于b的數,將其設置為-1; 對于大于b的數,將其設置為1; 用類似于求前綴和的方法,只要某一段區間和為0,則該段即符合條件(自己思考)

但是這題的范圍是100000 所以我們需要做一點處理,就是將b前后兩段分別處理,統計區間和為x的個數,ans=sigma(l[x] * r[x]) 具體細節看代碼

代碼

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 100010int a[N],sl[N * 2],sr[N * 2];int n,b,pos;int main(){ scanf("%d%d",&n,&b); for(int i = 1;i <= n;i++) { scanf("%d",&a[i]); if(a[i] == b) pos = i; } memset(sl,0,sizeof(sl)); memset(sr,0,sizeof(sr)); int sum = 0; sl[N] = sr[N] = 1; for(int i = pos - 1;i >= 1;i--) sum += a[i] < b ? 1 : -1,sl[sum + N] ++; sum = 0; for(int i = pos + 1;i <= n;i++) sum += a[i] > b ? 1 : -1,sr[sum + N] ++; int ans = 0; for(int i = N - n;i <= N + n;i++) ans += sl[i] * sr[i];
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 晴隆县| 商南县| 瑞安市| 河津市| 阳山县| 维西| 南岸区| 田阳县| 荃湾区| 四子王旗| 高安市| 田东县| 寿光市| 花垣县| 宕昌县| 武隆县| 建瓯市| 苗栗市| 马公市| 卢湾区| 义乌市| 富川| 原阳县| 海原县| 平遥县| 金秀| 温宿县| 焉耆| 莱西市| 莆田市| 泰顺县| 湘西| 黔西县| 内江市| 鄂伦春自治旗| 若尔盖县| 大荔县| 科技| 慈溪市| 壶关县| 洪泽县|