这篇文章上次修改于 574 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
本文共 2264 个字,阅读时长 ≈ 6 分钟
题意
输入
思路
这题思路不大好想,先考虑暴力。30分的暴力可以直接
这里有一个应该是套路的东西吧,求区间平均数
设区间长度为
证毕撒花~
那么就是对于已经减完的数组求个前缀和,如果
然后总共做两次操作,一次是减去
如果你用树状数组求逆序对的话,要注意因为前缀和有可能为负数,树状数组又是在值域上开的,所以要简单离散化一下,防止下标爆炸。
这篇文章上次修改于 574 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
本文共 2264 个字,阅读时长 ≈ 6 分钟
输入
这题思路不大好想,先考虑暴力。30分的暴力可以直接
这里有一个应该是套路的东西吧,求区间平均数
设区间长度为
证毕撒花~
那么就是对于已经减完的数组求个前缀和,如果
然后总共做两次操作,一次是减去
如果你用树状数组求逆序对的话,要注意因为前缀和有可能为负数,树状数组又是在值域上开的,所以要简单离散化一下,防止下标爆炸。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define int long long
#ifdef ONLINE_JUDGE
#define debug(x)
#else
#define debug(x) cout<<' '<<#x<<'='<<x<<endl
#endif
using namespace std;
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*f;
}
const int N=1000006;
int n,l,r,c1,c2;
int a[N],b[N],c[N],bit[N],s1[N],s2[N];
//以下为树状数组求逆序对
inline int lb(int x){return x&(-x);}
inline void add(int x){
while(x<=n){
bit[x]++;
x+=lb(x);
}
}
inline int query(int x){
int res=0;
while(x){
res+=bit[x];
x-=lb(x);
}
return res;
}
signed main()
{
// freopen("niu.in","r",stdin);
// freopen("niu.out","w",stdout);
n=read();
l=read(); r=read();
for(int i=1;i<=n;++i){
a[i]=read();
//分别求出-l和-r的前缀和
s1[i]=a[i]-r+s1[i-1];
s2[i]=a[i]-l+s2[i-1];
//离散化数组
b[i]=s1[i]; c[i]=s2[i];
//这里先统计一下
if(s1[i]<=0) ++c1;
if(s2[i]<0) ++c2;
}
//离散化
sort(b+1,b+1+n);
sort(c+1,c+1+n);
int m1=unique(b+1,b+1+n)-b-1,m2=unique(c+1,c+1+n)-c-1;
for(int i=1;i<=n;++i){
s1[i]=lower_bound(b+1,b+m1+1,s1[i])-b;
s2[i]=lower_bound(c+1,c+m2+1,s2[i])-c;
}
//求逆序对个数
for(int i=n;i;i--){
c1+=query(s1[i]);
add(s1[i]);
}
memset(bit,0,sizeof(bit));
for(int i=n;i;i--){
c2+=query(s2[i]-1);
add(s2[i]);
}
//计算概率输出答案
int ans=c1-c2,nn=(n+1)*n/2;
int d=__gcd(ans,nn);
if(ans==nn) printf("1");
else if(ans==0) printf("0");
else printf("%lld/%lld",ans/d,nn/d);
return 0;
}
未注明转载的皆为原创文章,允许转载但请注明原作者信息
阿里嘎多~欢迎多来玩玩
已有 6 条评论
不懂~单纯路过~
@Teacher Du
好题!感谢分享!
@ricky
大佬哇
,我什么时候也能这么厉害
@云晓晨 专业不对口
你也超强的好不好