Luogu P2114/ACAG 0x01-5 起床困难综合征

本题的关键之处在于,题目中给定的三种位运算——AND,OR,XOR,在二进制下皆是不进位的。这说明每一位都是独立的,启发我们可以按位考虑。

因此我们从最高位向最低为依次考虑,每一位应该填$0$还是$1$。

因为题目中$m \leq 109$,所以最多有$30$位。($109<2^{30}-1$)

对于第$k$位(最低位为第$0$位),改为应该填$1$,当且仅当满足下列两个条件:

  1. 已经填好的更高位构成的数值加上$2^k\ (1<<k)$之后不超过$m$;
  2. 用每个参数的第$k$位参与全部位运算。在所有位运算结束后保持不变。

易知,对于条件2,如果不满足,则说明填$1$不如填$0$更优。

在依次考虑完每一位后,就得到了答案。

#include<bits/stdc++.h>
#define N 100010 using namespace std; int n,m,t,cnt,ans,tmp;
char c[5]; struct node {
int op,t;
}a[N]; void Read() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%s%d",c,&t);
if(c[0]=='A') {
a[++cnt].op=1;
}
else if(c[0]=='O') {
a[++cnt].op=2;
}
else if(c[0]=='X') {
a[++cnt].op=3;
}
a[cnt].t=t;
}
return;
} int Calc(int bit,int val) {
int ret=val;
for(int i=1;i<=n;i++) {
int x=(a[i].t>>bit)&1;
if(a[i].op==1) {
ret&=x;
}
else if(a[i].op==2) {
ret|=x;
}
else if(a[i].op==3) {
ret^=x;
}
}
return ret;
} void Solve() {
for(int i=29;i>=0;i--) {
int val0,val1;
val0=Calc(i,0);
val1=Calc(i,1);
if(tmp+(1<<i)<=m&&val0<val1) {
tmp+=(1<<i);
ans+=(val1<<i);
}
else {
ans+=(val0<<i);
}
}
printf("%d",ans);
return;
} int main()
{
Read();
Solve();
return 0;
}

Luogu P2114/ACAG 0x01-5 起床困难综合征的更多相关文章

  1. 【洛谷P2114】起床困难综合征 位运算+贪心

    题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...

  2. 洛谷P2114起床困难综合征

    从高位到低位按位枚举,贪心.如果该位填1比填0结果优且填1不会超出m限制,那就填1,否则填0 /*by SilverN*/ #include<iostream> #include<c ...

  3. 【Luogu】2114起床困难综合征(位运算贪心)

    题目链接 这题真是恶心死我了. 由于位运算每一位互不干涉,所以贪心由大到小选择每一位最优的解,但是要判断一下边界,如果选择该解使得原数>m则不能选择. 代码如下 #include<cstd ...

  4. NOI2014 洛谷P2114 起床困难综合征(位运算)

    呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该 ...

  5. [NOI2014]起床困难综合征

    Description: 有n扇门,每扇门上有一个位运算符(&,|,^) 和一个权值,要求合理的选择一个不超过m的数,使其按顺序经过这些门的运算后最大 Hint: \(n \le 10^5\) ...

  6. [NOI 2014] 起床困难综合征

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3668 [算法] 从高位向低位贪心即可 时间复杂度 : O(30N) [代码] #in ...

  7. 省队集训Day1 睡觉困难综合征

    传送门:https://www.luogu.org/problem/show?pid=3613 [题解] 按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做. 写棵LCT,维护正反两种权值, ...

  8. Luogu3613 睡觉困难综合征/BZOJ4811 Ynoi2017 由乃的OJ 树链剖分、贪心

    传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的 ...

  9. [bzoj3668][Noi2014]起床困难综合症_暴力

    起床困难综合征 bzoj-3668 Noi-2014 题目大意:题目链接. 注释:略. 想法:Noi考这题...联赛T1难度.... 我们将每个门上的数二进制拆分. 发现:当前位的操作可能直接确定了当 ...

随机推荐

  1. CSS继承控制:inherit、initial和unset

    CSS里有三种常用的属性值继承方式:inherit,initial和unset.我们用一个简单的例子来演示一下: <ul style="color: green;"> ...

  2. Centos7无法播放mp4视频(待验证)

    新安装Centos7后,发现无法正常播放本地mp4视频 可以尝试安装 yum -y install ffmpeg 安装之后,需要重启电脑才能生效 浏览器安装年flash,只能播放部分视频,也有可能是s ...

  3. 递归下降和LL(1)语法分析

    什么是自顶向下分析法 在语法分析过程中一般有两种语法分析方法,自顶向下和自底向上,递归下降分析和LL(1)都属于是自顶向下的语法分析 自顶向下分析法的过程就像从第一个非终结符作为根节点开始根据产生式进 ...

  4. Equinox开源项目CQRS架构分析

    CQRS架构下Equinox开源项目分析 一.DDD分层架构介绍 本篇分析CQRS架构下的Equinox开源项目.该项目在github上star占有2.4k.便决定分析Equinox项目来学习下CQR ...

  5. PHP防止刷微信红包方法

    PHP防止刷微信红包方法1 输入验证码2授权登陆后 领取红包记录下 openid ip 第二次用openid或者ip(ip)连接同一个路由器是一样的 所以用ip 判断最好是判断有没有6个以上 判断有没 ...

  6. openshift 使用curl命令访问apiserver

    openshift版本:openshift v3.6.173.0.5 使用oc(同kubectl)命令访问apiserver资源的时候,会使用到/root/.kube/config文件中使用的配置. ...

  7. pat 1100

    1100 Mars Numbers (20 分)   People on Mars count their numbers with base 13: Zero on Earth is called ...

  8. Three.js构造一个简单的房间

    主要研究three.js在3D场景中基本使用:画一个简单的房子.房子上画门和玻璃.房间内放一个床.定义鼠标事件可以移动场景.动画的使用等. 1.Three.js画的一个简单的房子,模拟地板以及四堵墙 ...

  9. C语言词法分析中的贪心算法

    C语言词法分析中的贪心算法 当我们写出a---b这种语句的时候我们应该考虑C语言的编译器是如何去分析这条语句的. C语言对于解决这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽可能多 ...

  10. Service must be explitict android 5.0问题

    如果target到API 21,有一些注意的事项,以下是目前我发现的两个问题1. Service must be explitict,从Lollipop开始,service必须显性声明,解决方案:ht ...