参考:http://www.cnblogs.com/widsom/p/9290269.html

传送门:http://codeforces.com/contest/1005/problem/E2

题意:求一段数列中,取其中中位数为m的子序列个数有几个;

思路:首先我们可以先求出——序列中大于等于 m的数占多数的子序列——有多少个。然后,再求出序列中大于等于m+1的数占多数的子序列有多少个。

前面序列的个数减去后面的序列个数,就是答案。

显然这两个个数的求法是一样的。具体来说,

因为要计算区间的大于等于m个数是否占多数,把大于等于m的记为1,小于的记为-1;

计算前缀和cnt[i]。

枚举右端点t, 1 ~ t 间大于m的个数就是cnt[ t ],这个时候,找到左端点q个数,要求 1 ~ q 的cnt [ q ]小于cnt[ t ],   这个q的个数就是对应右端点为 t 时子序列的个数,加到ans中。

怎么找到q的个数,如果从1 ~ i枚举是会超时的,这时候就出了树状数组,感觉前缀和用树状数组很方便。

把cnt[q] 加上  n  再add进树状数组中。

这里有个细节就是,开始的时候要add(n+1),因为还要考虑左端点为0的情况。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll; int n,m;
const int maxn = 2e5+;
int a[maxn];
ll sum[maxn*],cnt[maxn*];
int lowbit(int x){
return x & (-x);
} void add(int x){
for(int i=x; i<=*n; i += lowbit(i)){
sum[i]++;
}
} ll getsum(int x){
ll res = ;
for(int i=x; i>; i-=lowbit(i)){
res += sum[i];
}
return res;
} ll solve(int x){ memset(cnt,,sizeof(cnt));
memset(sum,,sizeof(sum)); for(int i=; i<=n; i++){
cnt[i] = cnt[i-] + (a[i]>=x?:-);
}
ll ans = ;
add(n+);
for(int i=; i<=n; i++){
ans += getsum(cnt[i]+n);
add(cnt[i]+n+);
}
return ans;
} int main(){
scanf("%d%d", &n, &m); for(int i=; i<=n; i++){
scanf("%d", &a[i]);
} printf("%I64d\n", solve(m) - solve(m+)); return ;
}

1005E2

CodeForces -Codeforces Round #496 (Div. 3) E2. Median on Segments (General Case Edition)的更多相关文章

  1. Codeforces Round #496 (Div. 3) E2 - Median on Segments (General Case Edition)

    E2 - Median on Segments (General Case Edition) 题目大意:给你一个数组,求以m为中位数的区间个数. 思路:很巧秒的转换,我们把<= m 数记为1, ...

  2. Codeforces 1005 E2 - Median on Segments (General Case Edition)

    E2 - Median on Segments (General Case Edition) 思路: 首先我们计算出solve(m):中位数大于等于m的方案数,那么最后答案就是solve(m) - s ...

  3. Codeforces Round #496 (Div. 3 ) E1. Median on Segments (Permutations Edition)(中位数计数)

    E1. Median on Segments (Permutations Edition) time limit per test 3 seconds memory limit per test 25 ...

  4. Codeforces Round #496 (Div. 3) E1. Median on Segments (Permutations Edition) (中位数,思维)

    题意:给你一个数组,求有多少子数组的中位数等于\(m\).(若元素个数为偶数,取中间靠左的为中位数). 题解:由中位数的定义我们知道:若数组中\(<m\)的数有\(x\)个,\(>m\)的 ...

  5. CodeForces - 1005E2:Median on Segments (General Case Edition) (函数的思想)

    You are given an integer sequence a1,a2,…,ana1,a2,…,an. Find the number of pairs of indices (l,r)(l, ...

  6. Codeforces Round #535 (Div. 3) E2. Array and Segments (Hard version) 【区间更新 线段树】

    传送门:http://codeforces.com/contest/1108/problem/E2 E2. Array and Segments (Hard version) time limit p ...

  7. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  8. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  9. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

随机推荐

  1. 续集:白菜的内涵,更新nand分区为ubifs,替换overlay

    在上一篇真千兆路由的极限之OPENWRT MAKE, 某品牌白菜价QCA9558/QCA9880/QCA8337N纯种组合OS搭建时记中附带了128M nand的空间图示,在ar71xx profil ...

  2. ansible批量管理服务 上

    1 ansible简介 1.1 ansible批量管理服务概述 (1)是基于python语言开发的自动化软件工具(2)是基于SSH远程管理服务实现远程主机批量管理(3)并行管理,部署简单,应用也简单方 ...

  3. 使用阿里云oss

    写这篇博文的原因是公司有个项目需要用到阿里云来存放用户头像文件.后期软件安装版本也可能需要存进去,然后折腾了两天终于摸熟了一点皮毛,在这里给大家简单介绍下. 一.初识对象存储oss 1.进入阿里云控制 ...

  4. mac下使用zerobrane调试cocos2dx的lua

    环境:MacOSx 10.9.2, Lua 5.1.4, luaSocket 2.0.2, xcode5.0.2 所需文件 luasocket-2.0.2.zip,ZeroBraneStudioEdu ...

  5. Linux故障处理最佳实践

    引言 业务中断了! 老板咆哮,主管抓狂,而你就是那个要去处理故障.恢复业务的不幸的人. 你独自一人在阴暗的隔间里.北边是老板的办公室,西边是Team Leader的办公室,南面是茶水间,在那你能泡上一 ...

  6. todaytt

    <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.Drawe ...

  7. 记忆化搜索模板题---leetcode 1155. 掷骰子的N种方法

    1155. 掷骰子的N种方法 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, ..., f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数 ...

  8. Python模块之ncclient

    一.简介 此模块是是netconf协议的客户端,可与netconf服务端进行交互 二.实验环境 1.操作系统:win10 2.python版本:python3.6.6 3.ncclient模块版本:0 ...

  9. node爬虫的几种简易实现方式

    说到爬虫大家可能会觉得很NB的东西,可以爬小电影,羞羞图,没错就是这样的.在node爬虫方面,我也是个新人,这篇文章主要是给大家分享几种实现node 爬虫的方式.第一种方式,采用node,js中的 s ...

  10. GStreamer基础教程07 - 播放速率控制

    摘要 在常见的媒体播放器中,通常可以看到快进,快退,慢放等功能,这部分功能被称为“特技模式(Trick Mode)”,这些模式有个共同点:都通过修改播放的速率来达到相应的目的. 本文将介绍如何通过GS ...