2 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=110000; int n,a[N];double ansand,ansor,ansxor; void solve(int k) { int last[2]={0,0},c1=0,c2=0; //last[0]为[1~r]最后一个0的位置,last[1]同理 //c1记录从r-1 前,第 1、3、5……段的总度 //c2记录从r-1 前,第 2、4、6……段的总度 //每一段以1结尾,前面都是0,可以是0个0 double p=double(1<<k)/n/n; for(int r=1;r<=n;r++) { int v=(a[r]>>k) & 1; //长度为1的情况 if(v){ansxor+=p;ansand+=p;ansor+=p;} //长度大于1的情况 if(v) { ansand+=p*(r-last[0] -1)*2; ansor+=p*(r-0 -1)*2; ansxor+=p*c1*2; } else { ansand+=0; ansor+=p*last[1]*2; ansxor+=p*c2*2; } c1++; if(v)swap(c1,c2); last[v]=r; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); ansand=ansor=ansxor=0.0; for(int k=0;k<=30;k++) solve(k); printf("%.3lf %.3lf %.3lf\n",ansxor,ansand,ansor); return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=110000; int n,a[N];double ansand,ansor,ansxor; void solve(int k) { int last[2]={0,0},c1=0,c2=0; //last[0]为[1~r]最后一个0的位置,last[1]同理 //c1记录从r-1 前,第 1、3、5……段的总度 //c2记录从r-1 前,第 2、4、6……段的总度 //每一段以1结尾,前面都是0,可以是0个0 double p=double(1<<k)/n/n; for(int r=1;r<=n;r++) { int v=(a[r]>>k) & 1; //长度为1的情况 if(v){ansxor+=p;ansand+=p;ansor+=p;} //长度大于1的情况 if(v) { ansand+=p*(r-last[0] -1)*2; ansor+=p*(r-0 -1)*2; ansxor+=p*c1*2; } else { ansand+=0; ansor+=p*last[1]*2; ansxor+=p*c2*2; } c1++; if(v)swap(c1,c2); last[v]=r; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); ansand=ansor=ansxor=0.0; for(int k=0;k<=30;k++) solve(k); printf("%.3lf %.3lf %.3lf\n",ansxor,ansand,ansor); return 0; }
- 1
信息
- ID
- 4719
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者