济南学习D2T2__数学分析题

【问题描述】
有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≤ 10 5
对于100%的数据,1 ≤ N≤ 5× 10 5 ,0 < L ≤ R ≤ 100。

______________________________________________________________________

很神奇的数学题,难在推公式,并把公式和信息学的东西联系起来。这是信息题吗?算是数学信息题吧!!!

推理过程:

1、求区间平均值在【l,r】间的概率

2、求平均值在[l,r]间的个数,在除以n(n+1)就可以了

3、[l,r]间的个数=小于等于r的个数-小于l的个数

4、小于l可以表示为(a[i]+a[i+1]+a[i+2]+……+a[i+k-1])/k<l

  继续推出(a[i]+a[i+1]+a[i+2]+……+a[i+k-1])<l*k

  再推出(a[i]+a[i+1]+a[i+2]+……+a[i+k-1])-l*k<0

  再再推出(a[i]-l+a[i+1]-l+a[i+2]-l+……+a[i+k-1]-l)<0

  让数组b[i]=a[i]-l;

  公式变为b[i]+b[i+1]+b[i+2]+……+b[i+k-1]<0

  用前缀和维护可得:s[i+k-1]-s[i-1]<0;

  这是什么?逆序对!!!逆序对的个数就是小于l的个数

  同理求出小于等于r的个数。差,OK!

  神啊!再让我做一遍,我还是做不出来!!!

______________________________________________________________________

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<algorithm>
  5
  6 using namespace std;
  7 long long n,l,r,ans1,ans2;
  8 long long a[500010],b[500010],c[500010],d[500010];
  9 void readlong(long long &x)
 10 {
 11     char c=getchar();
 12     int fh=1;
 13     for(;c>‘9‘||c<‘0‘;c=getchar())if(c==‘-‘)fh*=-1;
 14     x=0;
 15     for(;c<=‘9‘&&c>=‘0‘;c=getchar())x=x*10+c-‘0‘;
 16     x=x*fh;
 17 }
 18
 19 void nxd1(long long l,long long r)
 20 {
 21     if(l==r)return;
 22     long long mid=(l+r)/2;
 23     nxd1(l,mid);nxd1(mid+1,r);
 24     long long z=l,y=mid+1,x=l;
 25     while(z<=mid&&y<=r)
 26     {
 27         if(b[z]>b[y])
 28         {
 29             ans1+=mid-z+1;
 30             d[x++]=b[y];y++;
 31         }
 32         else
 33         {
 34             d[x++]=b[z];z++;
 35         }
 36     }
 37     while(z<=mid)
 38     {
 39         d[x++]=b[z];z++;
 40     }
 41     while(y<=r)
 42     {
 43         d[x++]=b[y];y++;
 44     }
 45     memcpy(b+l,d+l,(r-l+1)*8);
 46 }
 47 void nxd2(long long l,long long r)
 48 {
 49     if(l==r)return;
 50     long long mid=(l+r)/2;
 51     nxd2(l,mid);nxd2(mid+1,r);
 52     long long z=l,y=mid+1,x=l;
 53     while(z<=mid&&y<=r)
 54     {
 55         if(c[z]>=c[y])
 56         {
 57             ans2+=mid-z+1;
 58             d[x++]=c[y];y++;
 59         }
 60         else
 61         {
 62             d[x++]=c[z];z++;
 63         }
 64     }
 65     while(z<=mid)
 66     {
 67         d[x++]=c[z];z++;
 68     }
 69     while(y<=r)
 70     {
 71         d[x++]=c[y];y++;
 72     }
 73     memcpy(c+l,d+l,(r-l+1)*8);
 74 }
 75 int main()
 76 {
 77     freopen("jian.in","r",stdin);
 78     freopen("jian.out","w",stdout);
 79     readlong(n);readlong(l);readlong(r);
 80     for(long long i=1;i<=n;i++)
 81     {
 82         readlong(a[i]);
 83         b[i]=b[i-1]+a[i]-l;
 84         c[i]=c[i-1]+a[i]-r;
 85     }
 86     ans1=0;nxd1(0,n);
 87     ans2=0;nxd2(0,n);
 88     ans2-=ans1;
 89     ans1=n*(n+1)/2;
 90     if(ans2==0)
 91     {
 92         cout<<"0"<<endl;return 0;
 93     }
 94     if(ans2==ans1)
 95     {
 96         cout<<"1"<<endl;return 0;
 97     }
 98     long long g=__gcd(ans1,ans2);
 99     cout<<ans2/g<<"/"<<ans1/g<<endl;
100     fclose(stdin);
101     fclose(stdout);
102     return 0;
103 }
时间: 2024-08-04 08:27:28

济南学习D2T2__数学分析题的相关文章

Python基础课:一起学习python基础题

python最近老火了,万能开发语言,很多小伙伴们要么初学,要么从别的开发语言转过来的,如果你能把下面几道基础题不费劲的写出来,基础应该可以打80分,可以进行进阶的学习了,如果下面的题目如果做不出来,拜托不要耽误时间,赶快打好基础,勿在浮沙筑高台. 题目出给新鸟打基础的,实现答案的方法千千万,如果老鸟有更厉害的答案就不要喷了,先谢谢了. 还有新鸟先不要看答案,不要看答案,不要看答案,(重要的事情说三遍)自己先去解,用自己最简单的想法去实现,能用python自带的方法就不要自己造轮子. 好啦,开始

软考学习如何刷题

刷题是用最短的时间读懂题目和问题,并且理清思路,短时间接触大量各种题型的方法.不光要把题做会,而且还要把自己会做的题练熟,熟能生巧,对于培养"题感",是很有意义的.具体到备考中的刷题,作者给出几种刷题策略. (1) 计时刷题 把历年考题顺利打乱,随机抽取出15-40道题,进行短时间刷题考试,并记录答题时间.考生刷题时不仅要提高正确率,还要关注做题时间,要求考生快速读题.审题及答题.目的是锻炼速度,提高敏捷能力.计时刷题具有用时短,方便锻炼的特点,参加工作的考生可在工作之余进行刷题,高效

51nod 1305 Pairwise Sum and Divide(数学分析题)

1305 Pairwise Sum and Divide 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 取消关注 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor((A[i]+A[j])/(A[i]*A[j])) return sum

济南学习D2T1__折纸带

他[问题描述]一张长度为n的纸带,我们可以从左至右编号为0 ?n(纸带最左端标号为0) .现在有m次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带的长度是多少.[输入格式]第一行两个数字n,m如题意所述.接下来一行m个整数代表每次折叠的位置.[输出格式]一行一个整数代表答案.[样例输入]5 23 5[样例输出]2[样例解释]树上有只鸟.[数据规模与约定]60%的数据,n,m ≤ 3000.对于100%的数据,n≤ 10 18 ,m ≤ 3000. ___________________

二叉树学习——简单入门题

入门题一: 输入一颗二叉树.你的任务是按从上到下.从左到右的顺序输出各个节点的值.每一个节点都依照从根节点到它的移动序列给出 (L表示左,R表示右).在输入中,每一个节点的左括号和右括号之间没有空格,相邻节点之间用一个空格隔开. 每颗树的输入用一 对空括号()结束(这对空括号不代表节点) 注意,假设从根到某个叶节点的路径上有的节点没有在输入中给出,或者给出了超出一次,应到输出 -1 .节点个数不超过256. 例子输入: (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,R

python模块学习第 0000 题

将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果: 好可爱>%<! 题目来源:https://github.com/Yixiaohan/show-me-the-code,感谢@史江歌以及其他人,让我找到了一个系统的学习python模块的好地方. 看到这个题目的第一印象是——额,难不成让我找qq的API,然后在手机APP的壁纸上提示QQ消息?好吧,我承认自己想复杂了,所以第二个想法就来了.因为博主最近学习比较杂乱无章,所以学习了tkin

【算法学习记录-排序题】【PAT A1012】The Best Rank

To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algrbra), and E - English. At the mean time, we encourage students by e

2016.10.30 济南学习 Day2 下午 T1

他 [问题描述] 一张长度为??的纸带,我们可以从左至右编号为0 ? ??(纸带最左端标号为 0).现在有??次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带 的长度是多少. [输入格式] 第一行两个数字??, ??如题意所述. 接下来一行??个整数代表每次折叠的位置. [输出格式] 一行一个整数代表答案. [样例输入] 5 2 3 5 [样例输出] 2 [样例解释] 树上有只鸟. [数据规模与约定] 对于60%的数据,??, ?? ≤ 3000. 对于100%的数据,?? ≤ 101

SVM学习笔记3-问题转化

在1中,我们的求解问题是:$min_{w,b}$ $\frac{1}{2}||w||^{2}$,使得$y^{(i)}(w^{T}x^{(i)}+b)\geq 1 ,1 \leq i \leq n$ 设$g_{i}(w)=-y^{(i)}(w^{T}x^{(i)}+b)+1 \leq 0$, 那么按照2中的定义,对应的拉格朗日函数为$L(w,b,\alpha)=\frac{1}{2}||w||^{2}-\sum_{i=1}^{n}\alpha_{i}[y^{(i)}(w^{T}x^{(i)}+b)