首先看到数据范围 10^6 肯定是 O(n) 或者一只老哥。
考虑把所有数减去 P,那么原问题就变成有多少和不小于 0 的子序列。
容易想到前缀和,那么相当于求不逆序对数量。
于是用树状数组求解即可。
注意判断从 11 开始的子串,相当于从 sum_i-sum_0其中 sum 表示前缀和。
特判或者加入一个 0皆可。
Code :
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(void) {
register int x=0,sgn=1,ch=getchar();
while(ch<48||57<ch) {if(ch==45)sgn=0;ch=getchar();}
while(47<ch&&ch<58) {x=x*10+ch-48; ch=getchar();}
return sgn? x:-x;
}
void write(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
#define lowbit(x) (x&(-x))
int n,P,Ans;
int c[1000006],rnk[1000006],pre[1000006];
inline void add(int x) {
while(x<=n) {
++c[x];
x+=lowbit(x);
}
}
inline int qry(int x) {
int v=0;