[CodePlus2017]可做题

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 87  Solved: 63
[Submit][Status][Discuss]

Description

qmqmqm希望给sublinekelzrip出一道可做题。于是他想到了这么一道题目:给一个长度为n的非负整数序列ai,你需
要计算其异或前缀和bi,满足条件b1=a1,bi=bi?1 xor ai(i≥2).但是由于数据生成器出现了问题,他生成的序列a
的长度特别长,并且由于内存空间不足,一部分ai已经丢失了,只剩余m个位置的元素已知。现在qmqmqm找到你,
希望你根据剩余的ai,计算出所有可能的a序列对应的b序列中∑=bi(1<=i<=N)的最小值。

Input

输入第一行两个非负整数n,m,分别表示原始序列a的长度及剩余元素的个数。
之后m行,每行2个数i,ai,表示一个剩余元素的位置和数值。
1<=N<=10^9,0<=M<=Min(n,10^5),0<=ai<=10^9
注意未知的 ai 可以超过已知 ai 的范围。
保证输入中所有的 i 不同,且满足 1 ≤ i ≤ n。

Output

输出一个整数表示可能的最小值

Sample Input

5 3
4 0
3 7
5 0

Sample Output

7
已知的 a 序列为: X, X, 7, 0, 0, 其中X表示这个位置丢失了。一种可能的 a 序列为
0, 7, 7, 0, 0, 对应的 b 序列为 0, 7, 0, 0, 0, 和最小为 7。可以证明不存在和更小的情况

HINT

来自 CodePlus 2017 11 月赛,清华大学计算机科学与技术系学生算法与竞赛协会 荣誉出品。
Credit:idea/卢政荣 命题/卢政荣 验题/何昊天
Git Repo:https://git.thusaac.org/publish/CodePlus201711
本次比赛的官方网址:cp.thusaac.org
感谢腾讯公司对此次比赛的支持。

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+离散相关推荐

  1. 【洛谷 P4934】 礼物 (位运算+DP)

    题目链接 位运算+\(DP\)=状压\(DP\)?(雾 \(a\&b>=min(a,b)\)在集合的意义上就是\(a\subseteq b\) 所以对每个数的子集向子集连一条边,然后答案 ...

  2. [剑指offer]面试题第[65]题[JAVA][不用加减乘除做加法][位运算]

    [问题描述][简单] [解答思路] 1. 位运算 时间复杂度:O(1) 空间复杂度:O(1) public int add(int a, int b) {while(b != 0) { // 当进位为 ...

  3. [剑指offer][JAVA][面试题56 - I][第260题][位运算][HashSet]

    [问题描述] [面试题56 - I] [数组中数字出现的次数] 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度 ...

  4. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 1 ...

  5. P4310-绝世好题【位运算,dp】

    正题 题目链接:https://www.luogu.org/problem/P4310 题目大意 一个长度为nnn的序列,求一个最长的子序列使得每个数&\&&前一个数不为0. ...

  6. 【做题记录】DP 杂题

    P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心: 吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 状态: \(f[i][j]\) 表示前 \(i\ ...

  7. 剑指 Offer 65. 不用加减乘除做加法(位运算,计组原理:补码、加法器)

    一.基础知识 做这题需要用到计算机组成原理的基础知识:二进制的表示以及加法器. 简要提下知识点,最好再去研究下来龙去脉,加深理解. (1)二进制加法 a b 非进位和s 进位c 0 0 0 0 0 1 ...

  8. [BZOJ3054] Rainbow的信号(考虑位运算 + DP?)

    传送门 BZOJ没数据范围... 其实数据范围是这样的.. 前20%可以直接n^3暴力枚举每个区间 前40%可以考虑每一位,因为所有数每一位都是独立的,而和的期望=期望的和,那么可以枚举每一位,再枚举 ...

  9. Codeforces Gym 102956 C. Brave Seekers of Unicorns(位运算 + dp)

    链接 :C. Brave Seekers of Unicorns 题意: 给你一个数 n (1 ≤ \leq ≤ n ≤ \leq ≤ 1e6),要求出有多少个严格单调递增的序列满足任意三个相邻的数满 ...

最新文章

  1. JVM致命错误日志(hs_err_pid.log)分析
  2. DataGrid 或 DataView 中删除项时告知是否删除
  3. git 添加用户名和邮箱_设置 Git 账户及邮箱
  4. c语言文件的读写通讯录,学C三个月了,学了文件,用C语言写了个通讯录程序
  5. 数据特征分析-正太分布
  6. PHP程序员面临的成长瓶颈
  7. GitHack 源码分析
  8. 实现Http Server
  9. python 列表、元组、字典、集合
  10. linux 64位 共享内存 创建失败,共享内存创建失败(已经存在)时如何获得已创建的共享内存?...
  11. 量化投资学习——股指期货研究(五)
  12. G1调优实践日记--G1HeapWastePercent和InitiatingHeapOccupancyPercent的应用
  13. xp信息服务器iis5.0,XP中安装iis5.0/IIS6.0的详细操作方法步骤(图文教程)
  14. 史上最全的 SQL 注入资料,收藏不谢
  15. u盘安装centos8黑屏_u盘centos7 安装 黑屏苹果电脑怎么安装win7系统还原
  16. vs没有添加引用_足球赛事比分:尤文图斯VS里昂欧冠
  17. 一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤
  18. 在vue中使用web3.js开发以太坊dapp
  19. Java方法excel文件转换成xml文件
  20. 基于javaweb的商品进销存系统(java+vue+springboot+mybatis+mysql)

热门文章

  1. java和前端哪个难学?
  2. HTML5新增相关标签的和属性
  3. 【排序算法】插入、选择、堆排、快排、归并、计数
  4. STM8 ADC转换模式-------带缓存的连续模式
  5. C++中STL-队列和优先队列
  6. 搭建linux环境的tomcat服务器
  7. 15.try...except...finally
  8. 放球问题 组合数学 转自百度百科
  9. MySQL优化之二:My SQL Server性能优化
  10. ADF12C+GLASSFISH4.1配置数据源