Luogu P2114/ACAG 0x01-5 起床困难综合征
Luogu P2114/ACAG 0x01-5 起床困难综合征
本题的关键之处在于,题目中给定的三种位运算——AND,OR,XOR,在二进制下皆是不进位的。这说明每一位都是独立的,启发我们可以按位考虑。
因此我们从最高位向最低为依次考虑,每一位应该填$0$还是$1$。
因为题目中$m \leq 109$,所以最多有$30$位。($109<2^{30}-1$)
对于第$k$位(最低位为第$0$位),改为应该填$1$,当且仅当满足下列两个条件:
- 已经填好的更高位构成的数值加上$2^k\ (1<<k)$之后不超过$m$;
- 用每个参数的第$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 起床困难综合征的更多相关文章
- 【洛谷P2114】起床困难综合征 位运算+贪心
题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...
- 洛谷P2114起床困难综合征
从高位到低位按位枚举,贪心.如果该位填1比填0结果优且填1不会超出m限制,那就填1,否则填0 /*by SilverN*/ #include<iostream> #include<c ...
- 【Luogu】2114起床困难综合征(位运算贪心)
题目链接 这题真是恶心死我了. 由于位运算每一位互不干涉,所以贪心由大到小选择每一位最优的解,但是要判断一下边界,如果选择该解使得原数>m则不能选择. 代码如下 #include<cstd ...
- NOI2014 洛谷P2114 起床困难综合征(位运算)
呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该 ...
- [NOI2014]起床困难综合征
Description: 有n扇门,每扇门上有一个位运算符(&,|,^) 和一个权值,要求合理的选择一个不超过m的数,使其按顺序经过这些门的运算后最大 Hint: \(n \le 10^5\) ...
- [NOI 2014] 起床困难综合征
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3668 [算法] 从高位向低位贪心即可 时间复杂度 : O(30N) [代码] #in ...
- 省队集训Day1 睡觉困难综合征
传送门:https://www.luogu.org/problem/show?pid=3613 [题解] 按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做. 写棵LCT,维护正反两种权值, ...
- Luogu3613 睡觉困难综合征/BZOJ4811 Ynoi2017 由乃的OJ 树链剖分、贪心
传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的 ...
- [bzoj3668][Noi2014]起床困难综合症_暴力
起床困难综合征 bzoj-3668 Noi-2014 题目大意:题目链接. 注释:略. 想法:Noi考这题...联赛T1难度.... 我们将每个门上的数二进制拆分. 发现:当前位的操作可能直接确定了当 ...
随机推荐
- LeetCode_448. Find All Numbers Disappeared in an Array
448. Find All Numbers Disappeared in an Array Easy Given an array of integers where 1 ≤ a[i] ≤ n (n ...
- XT交易所API
HTTPAPI xt为用户提供了一个简单的而又强大的API,旨在帮助用户快速高效的将xt交易功能整合到自己应用当中. API地址域名地址 域名地址:https://www.xt.com/ 使用说明 使 ...
- Java之字符和字符串
字符类型 字符类型char是基本数据类型,它是character的缩写.一个char保存一个Unicode字符: char c1='A'; char c2='中'; 因为Java在内存中总是使用Uni ...
- Java并发之等待/通知机制
目录 1 前言 1.1 先来段代码放松一下 2 Object wait()/notify() 2.1 一段入门代码 2.2 问题三连击 a.为什么官方说wait() 要放在while里面? b.为什么 ...
- css3写下雨效果
css3写下雨效果<pre><div class="xiayuxiaoguo"></div></pre> <pre>.x ...
- SQL Server MERGE(合并)语句
如何使用SQL Server MERGE语句基于与另一个表匹配的值来更新表中的数据. SQL Server MERGE语句 假设有两个表,分别称为源表和目标表,并且需要根据与源表匹配的值来更新目标表 ...
- webStrom中React语法提示,React语法报错处理
1,webStrom中React语法报错 ①, 取消Power Save Mode的勾选 File——Power Save Mode ②,webstorm开发react-native智能提示 随便在一 ...
- MyBatis参数条件查询传入的值为0时的判断
MyBatis条件查询对字段判断是否为空一般为: <if test="testValue!=null and testValue != ''"> and test_va ...
- 嵌入式02 STM32 实验06 按键
按键实验和前面的跑马灯.蜂鸣器主要的区别就是这个是读取外部的输入信号,之前的实验都是对外部输出信号. 一.硬件设计 本实验的硬件为三个按键.两个lED(LED0.LED1).一个蜂鸣器(BEEP). ...
- 深度学习-CNN+RNN笔记
以下叙述只是简单的叙述,CNN+RNN(LSTM,GRU)的应用相关文章还很多,而且研究的方向不仅仅是下文提到的1. CNN 特征提取,用于RNN语句生成图片标注.2. RNN特征提取用于CNN内容分 ...