国产探花免费观看_亚洲丰满少妇自慰呻吟_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];
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐清市| 句容市| 镇安县| 繁峙县| 赤壁市| 双江| 马龙县| 莒南县| 金阳县| 黑山县| 宝坻区| 阳春市| 叙永县| 太谷县| 英吉沙县| 青浦区| 保定市| 旬邑县| 札达县| 罗平县| 大兴区| 丰顺县| 元江| 福安市| 科技| 邢台县| 综艺| 大同市| 清涧县| 来安县| 玉林市| 莒南县| 汾阳市| 宣恩县| 镇远县| 新密市| 育儿| 育儿| 保定市| 广河县| 江城|