bzoj5108 [CodePlus2017]可做题 位运算dp+离散
[CodePlus2017]可做题
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 87 Solved: 63
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
4 0
3 7
5 0
Sample Output
已知的 a 序列为: X, X, 7, 0, 0, 其中X表示这个位置丢失了。一种可能的 a 序列为
0, 7, 7, 0, 0, 对应的 b 序列为 0, 7, 0, 0, 0, 和最小为 7。可以证明不存在和更小的情况
HINT
Source
题解,各个位置上的位运算是相互不影响的,
所以可以分开来dp,然后,对于相差两个即以上的可以抵消,
那么是需要特殊处理,一个的话默认为前面的或者0,数据范围比较大,需要离散化。
1 #include<cstring> 2 #include<cmath> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdio> 6 7 #define ll long long 8 using namespace std; 9 inline int read() 10 { 11 int x=0,f=1;char ch=getchar(); 12 while(ch>'9'||ch<'0'){if (ch=='-') f=-1;ch=getchar();} 13 while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 17 int n,m,b[300005],pre; 18 ll ans,f[300005][2]; 19 struct node{int id,val;}a[300005]; 20 bool cmp(node a,node b){return a.id<b.id;} 21 int main() 22 { 23 n=read();m=read();n=0; 24 for (int i=1;i<=m;i++) 25 a[i].id=read(),a[i].val=read(); 26 sort(a+1,a+m+1,cmp); 27 for (int i=1;i<=m;i++) 28 { 29 if (a[i].id-pre-1>=2){b[++n]=-1;b[++n]=-1;b[++n]=a[i].val;} 30 else if (a[i].id-pre==2){b[++n]=-1;b[++n]=a[i].val;} 31 else b[++n]=a[i].val; 32 pre=a[i].id; 33 } 34 f[0][1]=1e15;f[0][0]=0; 35 for (int p=0;p<=30;p++) 36 { 37 for (int i=1;i<=n;i++) 38 if (b[i]<0) 39 { 40 f[i][1]=min(f[i-1][0]+(1<<p),f[i-1][1]+(1<<p)); 41 f[i][0]=min(f[i-1][1],f[i-1][0]); 42 } 43 else 44 { 45 if (b[i]&(1<<p)) 46 { 47 f[i][1]=f[i-1][0]+(1<<p); 48 f[i][0]=f[i-1][1]; 49 } 50 else 51 { 52 f[i][1]=f[i-1][1]+(1<<p); 53 f[i][0]=f[i-1][0]; 54 } 55 } 56 ans+=min(f[n][0],f[n][1]); 57 } 58 printf("%lld",ans); 59 }
转载于:https://www.cnblogs.com/fengzhiyuan/p/8119397.html
bzoj5108 [CodePlus2017]可做题 位运算dp+离散相关推荐
- 【洛谷 P4934】 礼物 (位运算+DP)
题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...
- [剑指offer]面试题第[65]题[JAVA][不用加减乘除做加法][位运算]
[问题描述][简单] [解答思路] 1. 位运算 时间复杂度:O(1) 空间复杂度:O(1) public int add(int a, int b) {while(b != 0) { // 当进位为 ...
- [剑指offer][JAVA][面试题56 - I][第260题][位运算][HashSet]
[问题描述] [面试题56 - I] [数组中数字出现的次数] 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度 ...
- C#LeetCode刷题-位运算
位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 1 ...
- P4310-绝世好题【位运算,dp】
正题 题目链接:https://www.luogu.org/problem/P4310 题目大意 一个长度为nnn的序列,求一个最长的子序列使得每个数&\&&前一个数不为0. ...
- 【做题记录】DP 杂题
P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心: 吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 状态: \(f[i][j]\) 表示前 \(i\ ...
- 剑指 Offer 65. 不用加减乘除做加法(位运算,计组原理:补码、加法器)
一.基础知识 做这题需要用到计算机组成原理的基础知识:二进制的表示以及加法器. 简要提下知识点,最好再去研究下来龙去脉,加深理解. (1)二进制加法 a b 非进位和s 进位c 0 0 0 0 0 1 ...
- [BZOJ3054] Rainbow的信号(考虑位运算 + DP?)
传送门 BZOJ没数据范围... 其实数据范围是这样的.. 前20%可以直接n^3暴力枚举每个区间 前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举 ...
- Codeforces Gym 102956 C. Brave Seekers of Unicorns(位运算 + dp)
链接 :C. Brave Seekers of Unicorns 题意: 给你一个数 n (1 ≤ \leq ≤ n ≤ \leq ≤ 1e6),要求出有多少个严格单调递增的序列满足任意三个相邻的数满 ...
最新文章
- JVM致命错误日志(hs_err_pid.log)分析
- DataGrid 或 DataView 中删除项时告知是否删除
- git 添加用户名和邮箱_设置 Git 账户及邮箱
- c语言文件的读写通讯录,学C三个月了,学了文件,用C语言写了个通讯录程序
- 数据特征分析-正太分布
- PHP程序员面临的成长瓶颈
- GitHack 源码分析
- 实现Http Server
- python 列表、元组、字典、集合
- linux 64位 共享内存 创建失败,共享内存创建失败(已经存在)时如何获得已创建的共享内存?...
- 量化投资学习——股指期货研究(五)
- G1调优实践日记--G1HeapWastePercent和InitiatingHeapOccupancyPercent的应用
- xp信息服务器iis5.0,XP中安装iis5.0/IIS6.0的详细操作方法步骤(图文教程)
- 史上最全的 SQL 注入资料,收藏不谢
- u盘安装centos8黑屏_u盘centos7 安装 黑屏苹果电脑怎么安装win7系统还原
- vs没有添加引用_足球赛事比分:尤文图斯VS里昂欧冠
- 一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤
- 在vue中使用web3.js开发以太坊dapp
- Java方法excel文件转换成xml文件
- 基于javaweb的商品进销存系统(java+vue+springboot+mybatis+mysql)