题面在这里
水题again
做法:
我这做法好像有一点点辣鸡(?)
emmmmm
我们首先将数组中小于
b
的数都打标记
设区间为
(l,r]
满足
(r−l)
是奇数。
我们要求的区间即应满足
2×(a[r]−a[l])+1=r−l
,且
(l,r]
经过
b
所在位置。
转化一下,得
所以我们可以开两个桶
tong[0/1]
分别记录偶数/奇数位子上
2×a[i]−i
的个数。
然后查询的时候就
ans+=tong[(i
&
1)
^
1][2×a[i]−i+1]
。
/*************************************************************
Problem: bzoj 1303 [CQOI2009]中位数图
User: fengyuan
Language: C++
Result: Accepted
Time: 56 ms
Memory: 4024 kb
Submit_Time: 2017-12-15 15:08:12
*************************************************************/
#include<bits/stdc++.h>
#define rep(i, x, y) for (int i = (x); i <= (y); i ++)
#define down(i, x, y) for (int i = (x); i >= (y); i --)
#define mid ((l+r)/2)
#define lc (o<<1)
#define rc (o<<1|1)
#define pb push_back
#define mp make_pair
#define PII pair<int, int>
#define F first
#define S second
#define B begin()
#define E end()
using namespace std;
typedef long long LL;
//head
const int N = 100010;
int n, m;
int a[N], tong[2][N*3];
int main()
{
scanf("%d%d", &n, &m); int p;
rep(i, 1, n){
int x; scanf("%d", &x);
if (x == m) p = i;
a[i] = a[i-1];
if (x < m) a[i] = a[i-1]+1;
}
//a[r]-a[l] = (r-l)/2___(r-l&1)=1
//2*(a[r]-a[l])+1 = r-l
//2*a[r] - 2*a[l] = r-l-1
//2*a[r] - r + 1 = 2*a[l] - l
tong[0][N] = 1;
LL ans = 0;
rep(i, 1, n){
if (i >= p) ans += tong[(i&1)^1][2*a[i]-i+1+N];
if (i < p) tong[i&1][2*a[i]-i+N] ++;
}
printf("%lld\n", ans);
return 0;
}