Sichuan State Programming Contest 2012 Binary Operations
来源:互联网 发布:nginx 配置多端口监听 编辑:程序博客网 时间:2024/04/28 01:02
详细:view
题意:给定数组,求连续子串的与,或,异或期望;
解法:利用性质dp求解,以a[i]结尾的子串有i个,这i个子串的和直接求解肯定T,所以可以利用以a[i-1]结尾的子串求得的和与a[i]进行运算就行了,具体为什么这样做可以,可以自己手动证明一下,所以对于每一个数,只需进行32次对比。
代码:
#include<cstdio>#include<cstring>using namespace std;const int max_n=50010;typedef long long LL;int n;int a[max_n];int tmp[33],num[33];void phi(int x){ int loc=32; //用来存上一层每一位上出现1的次数 memset(tmp,0,sizeof(tmp)); //用来存所有子串求和后每一位最终1出现的次数。 memset(num,0,sizeof(num)); while(x){ tmp[loc]=num[loc]=x&1; loc--; x>>=1; }}void solve(){ phi(a[1]); LL sum=1LL*n*(n+1)/2; for(int i=2;i<=n;i++) { for(int t=0;t<32;t++){ if((a[i]&(1<<t))==0) tmp[32-t]=0; else tmp[32-t]++; num[32-t]+=tmp[32-t]; } } LL now=0; for(int i=1;i<=32;i++) now=2*now+num[i]; printf(" %.6lf",1.0*(double)now/sum); phi(a[1]); for(int i=2;i<=n;i++) { for(int t=0;t<32;t++){ //因为此前出现过i-1个数,只要当前位是1,则或运算后,上一层的每一位 //全都变为1,而上一层有i-1个数,加上a[i]也是一个子串,所以就是i了。 if((a[i]&(1<<t))==(1<<t)) tmp[32-t]=i; num[32-t]+=tmp[32-t]; } } now=0; for(int i=1;i<=32;i++) now=2*now+num[i]; printf(" %.6lf",1.0*(double)now/sum); phi(a[1]); for(int i=2;i<=n;i++) { for(int t=0;t<32;t++){ //因为对于异或运算来说,a[i]的某一位为1时,对当前1的个数有贡献的 //只有0,即只需知道上一层0的个数,即i-1-tmp[32-t],加上子串后, //就是i-tmp[32-t]个1了。当某一位为0时,对上一层的状态来说并不改变。 if((a[i]&(1<<t))==(1<<t)) tmp[32-t]=i-tmp[32-t]; num[32-t]+=tmp[32-t]; } } now=0; for(int i=1;i<=32;i++) now=2*now+num[i]; printf(" %.6lf",1.0*(double)now/sum);}int main(){ int T,ca=0; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); printf("Case #%d:",++ca); solve(); printf("\n"); } return 0;}
0 0
- Sichuan State Programming Contest 2012 Binary Operations
- Sichuan State Programming Contest 2012 Journey
- Sichuan State Programming Contest 2012 - Journey
- Sichuan State Programming Contest 2011 —— D.Division
- Sichuan University Programming Contest 2013 Final (singal)E题
- Sichuan University Programming Contest 2013 Final (Single)F题
- Sichuan University Programming Contest 2013 Final (Single)C题
- 2017 SiChuan collegiate programming contest 训练总结 【持续更新中】
- Sichuan University Programming Contest 2011 Preliminary(for Non-SCUers) / 解题报告 4.4
- Sichuan University Programming Contest 2011 Preliminary(for Non-SCUers) / A Course
- Sichuan University Programming Contest 2011 Preliminary(for Non-SCUers) / M A Simple Problem
- Sichuan University Programming Contest 2011 Preliminary(for Non-SCUers) / B The Weight of Tree
- Sichuan University Programming Contest 2011 Preliminary(for Non-SCUers) / C A Coin Problem
- 2015 Sichuan Province Contest (Carries)
- German collegiate programming contest 2012 - Ski Jumping
- 【dp+动态分配二维数组+模逆元】CQU_QUALIFICATION FOR SICHUAN CONTEST 题解
- [SCU4436] Easy Math [2015 Sichuan Province Contest Final A]
- [SCU4437] Carries [2015 Sichuan Province Contest Final B]
- 查看Linux启动的各种服务
- TreeMap和TreeSet
- Tyvj P1108(守望者的逃离-贪心)
- 数组大折腾(4)
- Python函数参数到底是按值还是按引用
- Sichuan State Programming Contest 2012 Binary Operations
- iOS问题
- Hibernate:unsaved-value
- 第13周项目1-数组大折腾(3)
- 数组大折腾(5)
- core animation calayer的详解
- Oracle内存全面分析(4)-1Oracle 的内存架构组成_1SGA.4共享池的内存管理(保留共享池和keep对象在共享池)、相关参数和视图
- 计算机视觉、机器学习相关领域论文和源代码
- HTML5调用本地摄像头