bzoj 3668 数位DP
收获:
1、如果有很多位操作,并且不包含+-×/等高级运算,那么可以一位一位考虑,如果求一个最优解,可以尝试逐位确定,这道题因为原始攻击值有范围,那么就需要数位DP。
1 /************************************************************** 2 Problem: 3668 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:288 ms 7 Memory:804 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #define max(a,b) ((a)>(b)?(a):(b)) 12 13 int n, m; 14 unsigned past[32][2]; 15 unsigned dp[32][2], top[32]; 16 17 int main() { 18 scanf( "%d%d", &n, &m ); 19 for( int i=0; i<32; i++ ) { 20 past[i][0] = 0; 21 past[i][1] = 1; 22 } 23 for( int i=1; i<=n; i++ ) { 24 char ch[10]; 25 unsigned t; 26 scanf( "%s%d", ch, &t ); 27 for( int b=0; b<32; b++ ) { 28 if( ch[0]=='A' ) { 29 past[b][0] &= (t>>b)&1; 30 past[b][1] &= (t>>b)&1; 31 } else if( ch[0]=='O' ) { 32 past[b][0] |= (t>>b)&1; 33 past[b][1] |= (t>>b)&1; 34 } else { 35 past[b][0] ^= (t>>b)&1; 36 past[b][1] ^= (t>>b)&1; 37 } 38 } 39 } 40 if( m==0 ) { 41 unsigned ans = 0; 42 for( int i=0; i<32; i++ ) 43 ans |= past[i][0]<<i; 44 printf( "%u\n", ans ); 45 } else { 46 for( int b=0; b<32; b++ ) 47 top[b] = (m>>b)&1; 48 49 int maxb=30; 50 while( top[maxb]==0 ) { 51 dp[maxb][1] = dp[maxb][0] = dp[maxb+1][1]|(past[maxb][0]<<maxb); 52 maxb--; 53 } 54 dp[maxb][1] = dp[maxb+1][1]|(past[maxb][1]<<maxb); 55 dp[maxb][0] = dp[maxb+1][1]|(past[maxb][0]<<maxb); 56 for( int i=maxb-1; i>=0; i-- ) { 57 for( int j=0; j<=1; j++ ) 58 dp[i][0] = max( dp[i][0], dp[i+1][0]|(past[i][j]<<i) ); 59 for( int j=0; j<top[i]; j++ ) 60 dp[i][0] = max( dp[i][0], dp[i+1][1]|(past[i][j]<<i) ); 61 dp[i][1] = dp[i+1][1]|(past[i][top[i]]<<i); 62 } 63 printf( "%u\n", max(dp[0][0],dp[0][1]) ); 64 } 65 }
View Code
转载于:https://www.cnblogs.com/idy002/p/4498719.html
bzoj 3668 数位DP相关推荐
- BZOJ 1833 数位DP
思路: 数位DP f[i][j][k]表示走到第i位 开头位j 数字k 出现的次数 $f[i][j][k]+=f[i-1][l][k];$ $f[i][j][j]+=base[i]$ calc的时候要 ...
- bzoj 3209 数位DP+欧拉定理
枚举1的个数,统计有那么多1的数的个数 1 /************************************************************** 2 Problem: 320 ...
- BZOJ 3679 数位DP
思路: f[i][j]表示i位数乘积为j的方案数 j的取值最多5000多种,那就开个map存一下好了 f[i][mp[k*rec[j]]]+=f[i-1][j]; //By SiriusRen #in ...
- BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...
- BZOJ 3329 Xorequ (数位DP、矩阵乘法)
BZOJ 3329 Xorequ (数位DP.矩阵乘法) 手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/arti ...
- BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数(数位DP+恶心细节)
BZOJ 1662: [Usaco2006 Nov]Round Numbers 圆环数 Time Limit: 5 Sec Memory Limit: 64 MB Description 正如你所知 ...
- [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】
题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...
- [数位dp] bzoj 3209 花神的数论题
[数位dp] bzoj 3209 花神的数论题 题意:中文题. 思路:和普通数位dp一样,这里转换成二进制,然后记录有几个一. 统计的时候乘起来就好了. 代码: #include"cstdl ...
- 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 2774 Solved: 1230 [Submit ...
最新文章
- 大雁蛋人工孵化的方法_大鹅繁殖有哪些方法,您了解吗?
- 客户端回传事件接口IPostBackEventHandler
- 如何关注掘金的所有小伙伴
- 使用NSCondition实现多线程同步
- css样式表中的样式覆盖顺序(转)
- java中的 =运算符_(二十七)、java中的运算符
- linux下无法执行PHP命令,错误 php: command not found
- javascript操作cookie实例
- 华龙电音基调网_华龙电音基调查询器下载(最好用的电音基调查询器) v1.4免费版...
- 谷歌服务安装包_安卓手机安装谷歌服务框架和Google Play傻瓜式教程 100%好用
- 《c语言 从入门到放弃》,从入门到放弃的?单片机这样做很容易!
- 电力拖动自动控制系统_专插本专业全面分析:电子工程及其自动化
- 《2020职场绿茶图鉴》
- 想网站稳定运营?不可不知 DDoS的攻击原理与防御方法
- android button 图片与文字一起
- English_do
- 考研英语阅读分析--03Text3
- Tcp/ip协议 详解
- halcon C++编程 第22讲 图像镜像 tcy
- android把音乐存到sd卡上,如何将音乐文件从原始文件夹保存到SD卡中android
热门文章
- android页面统计代码,android流量统计(示例代码)
- Leecode 136. 只出现一次的数字
- cba比赛比分预测_【CBA直播】深圳vs广东前瞻:深圳战广东再掀反攻?
- C语言项目:图形马赛克处理技术
- 家用计算机注意哪些参数,电脑小白买内存条要注意哪些?主要看哪些参数?这些知识要掌握...
- 光端机的作用有哪些?
- poe交换机的作用和优点
- 如何有效维护PDH光端机的常见故障?
- [渝粤教育] 西南科技大学 经济数学1 在线考试复习资料
- 【渝粤教育】广东开放大学 商法 形成性考核 (40)