E1还是比较简单的
由于每个合法区间必定包含m
把m左边看成一块,m右边看成一块
预处理前面一部分和后面一部分的大于小于m的个数差
比如前面有x个数比m大,那么就要求后面有-x数比m大
当然,后面有-x+1个数比m大也行
可以用数组统计,但是我太傻了,用的树状数组
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=4e5+10;
int n,m,a[maxn],ans,sumn[maxn];
int lowbit(int x){
return x&(-x);
}
void add(int x){
for(;x<=400000;x+=lowbit(x)) sumn[x]++;
}
int ask(int x){
int ans=0;
for(;x;x-=lowbit(x) ) ans+=sumn[x];
return ans;
}
int query(int l){
return ask(l)-ask(l-1);
}
signed main()
{
cin >> n >> m;
int num=0;
for(int i=1;i<=n;i++)
{
cin >> a[i];
if( a[i]==m ) num=i;
}
int zhi=0;
for(int i=num-1;i>=1;i--)
{
if( a[i]>m ) zhi++;
else zhi--;
if( zhi==0||zhi==1 ) ans++;//相差0或1也可以
add( zhi+200000 );
}
zhi=0;
for(int i=num+1;i<=n;i++)
{
if( a[i]>m ) zhi++;
else zhi--;
if( zhi==0||zhi==1 ) ans++;
ans+=query(-zhi+200000)+query(-zhi+200001);
}
cout << ans+1;//加上单独的m一种
}