【问题描述】

有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[L,R]中则你比较厉害。求你比较厉害的概率。

【输入格式】

第一行有三个数N, l, r,含义如上描述。

接下来一行有N个数代表每一个数的值。

【输出格式】

输出一行一个分数a/b代表答案,其中a, b互质。 如果答案为整数则直接输出该

整数即可。

【样例输入 1】

4 2 3

3 1 2 4

【样例输出 1】

7/10

【样例输入 2】

4 1 4

3 1 2 4

【样例输出 2】

1

【样例解释】

塔外面有棵树。

【数据规模与约定】

对于30%的数据, 1 ≤ N ≤ 104。

对于60%的数据, 1 ≤ N ≤ 105。

对于100%的数据, 1 ≤ N ≤ 5 × 105, 0 < l ≤ r ≤ 100。

/*
要求区间平均值∈[L,R]的区间个数
现在我们来求区间平均值在1~r的个数和1~l(不包括l)的个数 前减后即为所求
以求1~r为例(用[L,R]-[1,L))
(a[i]+a[i+1]+......+a[i+k-1])/k<=r
[(a[i]+a[i+1]+......+a[i+k-1])+kr]/k<=0
[(a[i]-r)+(a[i+1]-r)+......+(a[i+k-1]-r)]/k<=0 (k>0)
so (a[i]-r)+(a[i+1]-r)+......+(a[i+k-1]-r)<=0
令s[i]=∑(a[i]-r)
即求s数组区间和<=0的个数
s[i+k-1]-s[i]<=0
s[i+k-1]<=s[i]
i<i+k-1
s[i]>=s[i+k-1]
即求s数组逆序对数.
答案为(ansr-ansl)/(n*(n+1)/2).
法二:要求[L,R]的合法答案只需求出不合法答案算补集.
合法的是>=l的正序对个数和<=r的逆序对个数.
so 只需求>=l的逆序对个数和<=r的正序对个数不合法即可(两者必定无交集).
(求正序对只需翻转数组即可orz.)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 500001
#define LL long long
using namespace std;
LL n,l,r,ansl,ansr,tot,a[MAXN],b[MAXN],b1[MAXN],tot1;
struct data{LL x,o;}s[MAXN],c[MAXN];
LL read()
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
bool cmp(const data &x,const data &y)
{
return x.x<y.x;
}
void add(LL x)
{
while(x<=n)
a[x]++,x+=x&-x;
return ;
}
LL query(LL x)
{
LL sum=0;
while(x>0) sum+=a[x],x-=x&-x;
return sum;
}
int main()
{
freopen("jian.in","r",stdin);
freopen("jian.out","w",stdout);
LL x;
n=read(),l=read(),r=read();
for(LL i=1;i<=n;i++) x=read(),c[i].o=s[i].o=i,
c[i].x=c[i-1].x+x-l,s[i].x=s[i-1].x+x-r;
sort(c+1,c+n+1,cmp),sort(s+1,s+n+1,cmp);
b[c[1].o]=1,b1[s[1].o]=1;
if(c[1].x<0) ansl++;
if(s[1].x<=0) ansr++;
for(LL i=2;i<=n;i++)
{
if(c[i].x==c[i-1].x) b[c[i].o]=b[c[i-1].o];
else b[c[i].o]=b[c[i-1].o]+1;
if(s[i].x==s[i-1].x) b1[s[i].o]=b1[s[i-1].o];
else b1[s[i].o]=b1[s[i-1].o]+1;
if(c[i].x<0) ansl++;
if(s[i].x<=0) ansr++;
}
for(LL i=n;i>=1;i--) ansl+=query(b[i]),add(b[i]+1);
memset(a,0,sizeof a);
for(LL i=n;i>=1;i--) ansr+=query(b1[i]),add(b1[i]);
LL ans=ansr-ansl,total=n*(n+1)/2;
LL xx=__gcd(ans,total);
ans/=xx,total/=xx;
if(total==1) cout<<ans;
else cout<<ans<<'/'<<total;
return 0;
}

最新文章

  1. Geoserver+Tomcat+GeoWebCache搭建地图服务
  2. Android中的四种动画(一)
  3. Scala深入浅出实战经典---001-Scala开发环境搭建和HelloWorld解析
  4. ViewPager图片轮转带点的
  5. 索引 使用use index优化sql查询
  6. linux查看硬件信息
  7. 也来一篇关于Infragistics WPF Report的使用教程 (一)
  8. 【Xamarin挖墙脚系列:Android最重要的命令工具ADB】
  9. [Machine Learning] Probabilistic Graphical Models:一、Introduction and Overview(1、Overview and Motivation)
  10. Storm实现单词计数
  11. 【转载】Java重构示例【1】
  12. OFFICE 您正试图运行的函数包含有宏或需要宏语言支持的内容。
  13. SQL去除数据库表中tab、空格、回车符等特殊字符的解决方法
  14. (已解决)jdk安装 系统找不到文件C:\ProgramData\Oracle\Java\javapath\java.exe
  15. 【php增删改查实例】第二十节 - 把用户管理页面集成到main.php中
  16. 转发:Android开发?用C#!!
  17. ArrayList删除--------ConcurrentModificationException问题
  18. UML(一)下载与安装
  19. .5-浅析webpack源码之入口函数
  20. asp.net 实现pdf、swf等文档的浏览

热门文章

  1. import xxx和from xxx import xx中修改被导入模块里面的变量的坑
  2. Ruby Rails学习中:调试信息和 Rails 的三种环境,Users 资源,调试器,Gravatar 头像和侧边栏
  3. 简单Kibana命令
  4. Kafka网络模型
  5. 实现a标签按钮完全禁用
  6. Flask框架学习篇(一)
  7. go语言入门(4)函数
  8. 第十章、jupyter入门之pandas
  9. springboot项目logback.xml或者logback-spring.xml中读取不到application.yml或application.properties配置文件中的配置解决办法
  10. Python中文转为拼音