[BZOJ3054] Rainbow的信号(考虑位运算 + DP?)
BZOJ没数据范围。。。
其实数据范围是这样的。。
前20%可以直接n^3暴力枚举每个区间
前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举区间,最大 31*n*n
想到枚举每一位也就离正解不远了,可以dp,
对于xor有贡献的是区间xor值为1的区间,那么f[i]表示以i结尾的区间异或值为1的个数,那么xor就很好解决了
对于or,我们只需要找出所有的全为0的区间,拿总区间个数减去就好,
对于and,我们只需要找出所有全为1的区间即可
#include <cstdio>
#include <cstring>
#define N 100005
#define LL long long
#define max(x, y) ((x) > (y) ? (x) : (y)) int p1, p0, mx;
int a[N], f[N];
LL n, num0, num1, cnt;
bool b[N];
double ans1, ans2, ans3;
//f[i]以i结尾的 xor值为1的数量 int main()
{
int i, j, k;
scanf("%lld", &n);
for(i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
mx = max(mx, a[i]);
}
for(k = 0; mx; mx >>= 1, k++);
for(i = 0; i < k; i++)
{
p0 = p1 = -1;
num0 = num1 = cnt = 0;
for(j = 1; j <= n; j++)
{
if(a[j] & (1 << i))
f[j] = j - f[j - 1];
else
f[j] = f[j - 1];
cnt += f[j];
b[j] = (a[j] & (1 << i));
}
for(j = 1; j <= n; j++)
{
if(!b[j] && p0 == -1) p0 = j;
if(b[j] && p0 ^ -1) num0 += (LL)(j - p0) * (j - p0), p0 = -1;
if(b[j] && p1 == -1) p1 = j;
if(!b[j] && p1 ^ -1) num1 += (LL)(j - p1) * (j - p1), p1 = -1;
}
if(p0 ^ -1) num0 += (LL)(j - p0) * (j - p0);
if(p1 ^ -1) num1 += (LL)(j - p1) * (j - p1);
cnt *= 2;
for(j = 1; j <= n; j++)
if(a[j] & (1 << i)) cnt--;
ans1 += 1.0 * (1 << i) * cnt / n / n;
ans2 += 1.0 * (1 << i) * num1 / n / n;
ans3 += 1.0 * (1 << i) * (n * n - num0) / n / n;
}
printf("%.3lf %.3lf %.3lf\n", ans1, ans2, ans3);
return 0;
}
[BZOJ3054] Rainbow的信号(考虑位运算 + DP?)的更多相关文章
- $CH$3801 $Rainbow$的信号 期望+位运算
正解:位运算 解题报告: 传送门! 其实就是个位运算,,,只是顺便加了个期望的知识点$so$期望的帕并不难来着$QwQ$ 先把期望的皮扒了,就直接分类讨论下,不难发现,答案分为两个部分 $\left\ ...
- 【洛谷 P4934】 礼物 (位运算+DP)
题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...
- bzoj5108 [CodePlus2017]可做题 位运算dp+离散
[CodePlus2017]可做题 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 87 Solved: 63[Submit][Status][Dis ...
- 【CF908E】New Year and Entity Enumeration 位运算+DP
[CF908E]New Year and Entity Enumeration 题意:给定$M=2^m-1$,我们称一个集合S是好的,当且仅当它满足:1.$\forall a\in S,a\ \ma ...
- 2019 ICPC Asia Nanchang Regional C And and Pair 找规律/位运算/dp
题意: 给定一个二进制表示的n,让你找满足如下要求的数对(i,j)的个数 $0 \leqslant j \leqslant i \leqslant n$ $ i & n = i $ $ i & ...
- 51nod 1406 位运算/dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1406 1406 与查询 题目来源: CodeForces 基准时间限制: ...
- leetcode 201. Bitwise AND of Numbers Range(位运算,dp)
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...
- 【BZOJ4300】绝世好题(位运算水题)
点此看题面 大致题意: 给你一个序列\(a\),让你求出最长的一个子序列\(b\)满足\(b_i\&b_{i-1}!=0\). 位运算+\(DP\) 考虑设\(f_i\)表示以第\(i\)个数 ...
- HDU 4949 Light(插头dp、位运算)
比赛的时候没看题,赛后看题觉得比赛看到应该可以敲的,敲了之后发现还真就会卡题.. 因为写完之后,无限TLE... 直到后来用位运算代替了我插头dp常用的decode.encode.shift三个函数以 ...
随机推荐
- nagios的安装配置
主要参考博客:http://www.cnblogs.com/mchina/archive/2013/02/20/2883404.html 实验环境:centos6.4 最小化安装系统 **** ...
- JS 字符串 时间 数字函数操作 事件
字符串 操作 var s="abcdefg" s.tolowerCase() 转小写 s.toupperCase() 转大写 s.substring(2,5) 索引下 ...
- MySQL 导出一句话
听说是很老的东西了,学习的时候发现还是很好用的,故学习转载过来,留备学习. mysql 导出一句话 方法1:网上流行的方法 流程:(1)建表--->(2)插入数据--->(3)select ...
- hihoCoder #1068 : RMQ-ST算法(模板)
AC G++ 826ms 146MB 思路: 时间复杂度O(nlogn). //#include <bits/stdc++.h> #include <iostream> #in ...
- (一)mybatis之JDBC介绍
前言:为什么在学mybatis之前要先了解JDBC呢?因为mybatis是以ORM模型为中心思想的框架,而所有的ORM模型都是基于JDBC进行封装的,不同的ORM模型对JDBC封装的强度是不一样的. ...
- Python学习日志9月13日
昨天的学习日志没有写,乱忙了一整天,政治电脑. 好奇心重,想要给电脑装上传说中LInux操作系统,各种小问题折腾到半夜,今天又折腾到晚上才真正的装上系统. 可是装上系统后又发现各种的不好用.虽然界面比 ...
- UVALive 4287 Proving Equivalence (强连通分量)
把证明的关系看出一张图,最终就是要所有的点都在至少一个环中.环的判断和度数有关. 用tarjan找强连通分量,在一个强连通分量点已经等价缩点以后形成一个DAG,计算入度为0的点数a, 出度为0的b,取 ...
- 强化学习_PolicyGradient(策略梯度)_代码解析
使用策略梯度解决离散action space问题. 一.导入包,定义hyper parameter import gym import tensorflow as tf import numpy as ...
- python matplotlib 可视化操作实例
具体代码: # encoding: utf-8 # coding = utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') from ...
- hibernate的注解
1.many-to-one @ManyToOne @JoinColumn(name = "user_id") 2.many-to-many /** * 双向关联关系中,有且仅有一端 ...