标签:input code 随机 答案 name 卡住了 有意思 status com
第1行,包含三个整数。n,L,R。
第2行n个数,代表a[1..n]。
仅1行,表示询问答案。
如果答案是整数,就输出整数;否则,输出既约分数“P/Q”来表示。
1 #pragma GCC optimze("O3") 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<cstring> 6 #include<queue> 7 #include<algorithm> 8 #include<cmath> 9 #include<map> 10 #include<vector> 11 #define N 100005 12 using namespace std; 13 int n,L,R; 14 long long a[2*N],sum[N*2],mx; 15 int q[2][N*2]; 16 int hea[2],en[2]; 17 long long ansa,ansb; 18 long long gcd(long long x,long long y) 19 { 20 if(y==0)return x; 21 return gcd(y,x%y); 22 } 23 bool check(double x) 24 { 25 memset(q,0,sizeof(q)); 26 hea[0]=hea[1]=1,en[0]=en[1]=0; 27 int now=1,la=0; 28 for(int i=L;i<2*n;i++) 29 { 30 swap(now,la); 31 while(hea[now]<=en[now]&&sum[q[now][en[now]]]-(double)(q[now][en[now]])*x>sum[i-L]-(double)(i-L)*x) en[now]--; 32 en[now]++; 33 q[now][en[now]]=i-L; 34 if(i>R) 35 while(hea[now]<=en[now]&&q[now][en[now]]<i-R)hea[now]++; 36 if(sum[i]-sum[q[now][hea[now]]]>=(double)(i)*x-(double)(q[now][hea[now]])*x) 37 { 38 ansa=sum[i]-sum[q[now][hea[now]]]; 39 ansb=i-q[now][hea[now]]; 40 long long t=gcd(ansa,ansb); 41 ansa/=t; 42 ansb/=t; 43 return 1; 44 } 45 } 46 return 0; 47 } 48 int main() 49 { 50 scanf("%d%d%d",&n,&L,&R); 51 if(L%2)L++; if(R%2)R--; 52 for(int i=1;i<=n;i++) 53 { 54 scanf("%lld",&a[i]); 55 a[i+n]=a[i]; 56 mx=max(mx,a[i]); 57 } 58 for(int i=1;i<n*2;i++) 59 sum[i]+=sum[i-1]+a[i]; 60 double li=0,ri=mx; 61 while(ri-li>1e-6) 62 { 63 double mid=(li+ri)/2; 64 if(check(mid)) li=mid; 65 else ri=mid; 66 } 67 if(ansb!=1) 68 printf("%lld/%lld\n",ansa,ansb); 69 else 70 printf("%lld\n",ansa); 71 return 0; 72 }
标签:input code 随机 答案 name 卡住了 有意思 status com
原文地址:http://www.cnblogs.com/liutianrui/p/7582467.html