收获:

  1、如果有很多位操作,并且不包含+-×/等高级运算,那么可以一位一位考虑,如果求一个最优解,可以尝试逐位确定,这道题因为原始攻击值有范围,那么就需要数位DP。

 /**************************************************************
Problem: 3668
User: idy002
Language: C++
Result: Accepted
Time:288 ms
Memory:804 kb
****************************************************************/ #include <cstdio>
#define max(a,b) ((a)>(b)?(a):(b)) int n, m;
unsigned past[][];
unsigned dp[][], top[]; int main() {
scanf( "%d%d", &n, &m );
for( int i=; i<; i++ ) {
past[i][] = ;
past[i][] = ;
}
for( int i=; i<=n; i++ ) {
char ch[];
unsigned t;
scanf( "%s%d", ch, &t );
for( int b=; b<; b++ ) {
if( ch[]=='A' ) {
past[b][] &= (t>>b)&;
past[b][] &= (t>>b)&;
} else if( ch[]=='O' ) {
past[b][] |= (t>>b)&;
past[b][] |= (t>>b)&;
} else {
past[b][] ^= (t>>b)&;
past[b][] ^= (t>>b)&;
}
}
}
if( m== ) {
unsigned ans = ;
for( int i=; i<; i++ )
ans |= past[i][]<<i;
printf( "%u\n", ans );
} else {
for( int b=; b<; b++ )
top[b] = (m>>b)&; int maxb=;
while( top[maxb]== ) {
dp[maxb][] = dp[maxb][] = dp[maxb+][]|(past[maxb][]<<maxb);
maxb--;
}
dp[maxb][] = dp[maxb+][]|(past[maxb][]<<maxb);
dp[maxb][] = dp[maxb+][]|(past[maxb][]<<maxb);
for( int i=maxb-; i>=; i-- ) {
for( int j=; j<=; j++ )
dp[i][] = max( dp[i][], dp[i+][]|(past[i][j]<<i) );
for( int j=; j<top[i]; j++ )
dp[i][] = max( dp[i][], dp[i+][]|(past[i][j]<<i) );
dp[i][] = dp[i+][]|(past[i][top[i]]<<i);
}
printf( "%u\n", max(dp[][],dp[][]) );
}
}

bzoj 3668 数位DP的更多相关文章

  1. bzoj 1833 数位dp

    很裸的数位dp. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #defi ...

  2. bzoj 3209 数位DP+欧拉定理

    枚举1的个数,统计有那么多1的数的个数 /************************************************************** Problem: 3209 Us ...

  3. BZOJ - 1026 数位DP

    中文题面,注意st是不可以放到dp里面的,否则每次solve都要清零 注意状态的转移要st&&i==0,因为子结构也可能是st(当高位取0时) 而st是必然合法的 #include&l ...

  4. BZOJ 3679 数位DP

    思路: f[i][j]表示i位数乘积为j的方案数 j的取值最多5000多种,那就开个map存一下好了 f[i][mp[k*rec[j]]]+=f[i-1][j]; //By SiriusRen #in ...

  5. BZOJ 3209 数位DP

    思路: 先预处理出来组合数 按位做 枚举sum[x]是多少 注意Mod不是一个质数 //By SiriusRen #include <cstdio> using namespace std ...

  6. [BZOJ 1833] [ZJOI2010] count 数字计数 【数位DP】

    题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i ...

  7. [BZOJ 1026] [SCOI 2009] Windy数 【数位DP】

    题目链接:BZOJ - 1026 题目分析 这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题.. 对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a ...

  8. BZOJ.4513.[SDOI2016]储能表(数位DP)

    BZOJ 洛谷 切了一道简单的数位DP,终于有些没白做题的感觉了...(然而mjt更强没做过这类的题也切了orz) 看部分分,如果\(k=0\),就是求\(\sum_{i=0}^n\sum_{j=0} ...

  9. bzoj 1026: [SCOI2009]windy数【数位dp】

    忘记limit不能记WA了一发-- 典型数位dp,变成work(r)-work(l-1),然后dfs的时候记录w当前位置,la上一个数选的什么,lm当前位是否有上限,ok当前位是否可以不考虑差大于等于 ...

随机推荐

  1. 芒果TV 视频真实的地址获取

    # coding=utf-8 import requests import json import re import os import urlparse import random vid = r ...

  2. Add custom daemon on Linux System

    Ubuntu add custom service(daemon) Task 需要在系统启动的时候自动启动一个服务(后台程序),在系统关闭的时候关闭服务. 比如在部署某个应用之前,需要将某个任务设置成 ...

  3. DenseNet笔记

    一.DenseNet的优点 减轻梯度消失问题 加强特征的传递 充分利用特征 减少了参数量 二.网络结构公式 对于每一个DenseBlock中的每一个层, [x0,x1,…,xl-1]表示将0到l-1层 ...

  4. Nginx - Header详解

    1. 前言 通过 HttpHeadersModule 模块可以设置HTTP头,但是不能重写已经存在的头,比如可能相对server头进行重写,可以添加其他的头,例如:Cache-Control,设置生存 ...

  5. XP远程连接Win10,提示【远程计算机需要网络级别身份验证,而您的计算机不支持该验证】

    最近电脑安装了Win10系统,在办公室可以通过其他电脑远程,但是回去后使用自己的电脑(XP系统)进行远程提示失败, 提示[远程计算机需要网络级别身份验证,而您的计算机不支持该验证],然后上网查找资料, ...

  6. thinkphp5 url传参

    url('index/blog/read',['id'=>5,'name'=>'thinkphp']); 手册https://www.kancloud.cn/manual/thinkphp ...

  7. GitHub正式启用声明

    0x00 说明 GitHub账号很早之前就已经注册,几经常识都没有能够好好的将这座宝库应用好,实在是汗颜.今天特地将GitHub重新拾起,以后一定要好好使用这个利器,不要荒废了. 0x01 内容 Gi ...

  8. Java集合类 课后练习

    1.Pg235--2分别向Set集合以及List集合中添加“A”,“a” , "c" , "C" , "a"  5个元素,观察重复值“a”能 ...

  9. INNODB表快速迁移

    本实验在一台server上启动了2个mysql实例端口分别是3307   3308,目的是将3307的表aaa迁移到3308中去,并打开3308的slave 1.在3308上 mysql> dr ...

  10. HTML5 Canvas游戏开发(三)lufylegend开源库件(上)

    lufylegend可以解决HTML5开发游戏中会遇到的一些问题: 1.各种浏览器对于JavaScript和HTML的解析是不一致的. 2.手机浏览器和PC浏览器的区别. 3.JavaScript并非 ...