【问题描述】
有?个数,随机选择一段区间,如果这段区间的所有数的平均值在[?,?]中则
你比较厉害。求你比较厉害的概率。
【输入格式】
第一行有三个数?,?,?,含义如上描述。
接下来一行有?个数代表每一个数的值。
【输出格式】
输出一行一个分数 ?
? 代表答案,其中?,?互质。如果答案为整数则直接输出该
整数即可。
【样例输入 1】
4 2 3
3 1 2 4
【样例输出 1】
7/10
【样例输入 2】
4 1 4
3 1 2 4
【样例输出 2】
1
【样例解释】
塔外面有棵树。
【数据规模与约定】
3 4 。
60%的数据,1 ≤ ? ≤ 10 5 。
对于100%的数据,1 ≤ ? ≤ 5× 10 5 ,0 < ? ≤ ? ≤ 100。
思路:
作为蒟蒻的我就不说了,说多了都是泪
来,上代码:
#include#include using namespace std; long long int n,ll,rr,a[500005],rx[500005]; long long int b[500005]; long long int ans=0,ans2; char ch; void qread(long long int &x) { x=0;ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch<='9'&&ch>='0'){x=x*10+(int)(ch-'0');ch=getchar();} } void gb(long long int l,long long int r,long long int flag) { if(l==r) return ; long long int mid=(l+r)/2; gb(l,mid,flag),gb(mid+1,r,flag); long long int lik=l,rik=mid+1,now=l-1; /*while(now */ while(lik<=mid&&rik<=r) { if((flag==1&&rx[lik] &&rx[lik]<=rx[rik])) { b[++now]=rx[lik++]; } else { b[++now]=rx[rik++]; ans+=mid-lik+1; } } while(lik<=mid) b[++now]=rx[lik++]; while(rik<=r) b[++now]=rx[rik++]; for(int i=l;i<=r;i++) rx[i]=b[i]; } long long int gcd(long long int m,long long int n) { if(n==0) return m; else return gcd(n,m%n); } int main() { qread(n),qread(ll),qread(rr); for(int i=1;i<=n;i++) qread(a[i]); for(int i=1;i<=n;i++) { // if(a[i]-rr<=0) ans++; rx[i]=rx[i-1]+a[i]-rr; if(rx[i]<=0) ans++; } gb(1,n,1); ans2=ans; ans=0; for(int i=1;i<=n;i++) { // if(a[i]-ll<0) ans++; rx[i]=rx[i-1]+a[i]-ll; if(rx[i]<0) ans++; } gb(1,n,2); //cout<2 ans=ans2-ans; ans2=n*(n+1)/2; //cout< return 0; }if(ans==ans2) printf("1\n"); else { if(ans==0) printf("0\n"); else { long long int kcc=gcd(ans2,ans); while(kcc!=1) { ans2/=kcc; ans/=kcc; kcc=gcd(ans2,ans); } cout< /'<' endl; } }