[NOI2014] 起床困难综合症

很明显是有关 二进制的的题

  • and 即 & (按位与)
    二进制下同一位同为1,位运算后为1
    例如 (1001 & 0111 = 0001)
    (1001)
    (&0111)
    (=0001)
    (1&1=1 1&0=1 0&1=1 0&0=0)
  • or 即 | (按位或)
    二进制下只要一位为1,位运算后为1
    例如 (1001|0111 = 1111)
    (1001)
    (|0111)
    (=0001)
    $1|1=1 1|0=1 0|1=0 0|0=0 $
  • xor 即 ^ (按位异或)
    二进制下相同为0,不同为1,也有人称之为不进位加法
    例如 (1001 ^ 0111 = 1110)
    (1001)
    (^0111)
    (=1110)
    (1^1=1 0^1=1 0^1=1 0^0=0)

介绍完基础操作后,暴力的思路其实很好想

枚举(1-m)所有数,每个数都(n)次进行操作,然后记录最大值
(是不是很简单啊,然后你发现你就tle了)

如果涉及到二进制操作,其实可以考虑枚举二进制的每一位(毕竟最多64位)

题目要求取最大值,根据这个思路(枚举二进制的每一位),我们是不是希望最终答案的二进制的每一位都为1,就能满足取得的最大值了

那么答案的二进制位怎么来的了?

由(1-m) 之间的某个数来的,我们只需要构造一个数满足(1-m) ,且经过n次位运算后,能尽可能的使答案的二进制位每位为1

然而我们并不用直接构造这么一个数,只需要每次确认1或0经过n次位运算之后,此位是否为1,如果0经过n次位运算之后能变为1,那么这位数为0,否则为1,并且让(m)减去((1<

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;
const int maxn=1e5+10;
int n,m;
int t[maxn],op[maxn];
int ans=0;
bool book(bool check,int j){//&#x8BA1;&#x7B97;&#x8FD9;&#x4E00;&#x4E2A;&#x4F4D;&#xFF0C;&#x7ECF;&#x8FC7;n&#x6B21;&#x4F4D;&#x8FD0;&#x7B97;&#x4E4B;&#x540E;&#x7684;&#xFF0C;&#x4E3A;1&#x8FD8;&#x662F;0
    for(int i=0;i<n;++i){ bool k="(t[i]">>j)&1;
        if(op[i]==1) check&=k;
        if(op[i]==2) check|=k;
        if(op[i]==3) check^=k;
    }
    return check;
}
int main(){
    cin>>n>>m;
    for(int i=0;i<n;++i){ string s;cin>>s>>t[i];
        if(s[0]=='A') op[i]=1;
        if(s[0]=='O') op[i]=2;
        if(s[0]=='X') op[i]=3;
    }
    for(int i=31;i>=0;--i){
        if(m>>i){//&#x6700;&#x5927;&#x503C;&#x8FD9;&#x4F4D;&#x6709;1&#xFF0C;&#x8BF4;&#x660E;&#x6211;&#x4EEC;&#x6240;&#x6C42;&#x7684;&#x7B54;&#x6848;&#x8FD9;&#x4F4D;&#x53EF;&#x4EE5;&#x4E3A;1&#x6216;0
            bool x=book(0,i),y=book(1,i);//x&#x4EE3;&#x8868;&#x539F;&#x6570;&#x6B64;&#x4F4D;&#x4E3A;0&#x65F6;&#xFF0C;&#x7ECF;&#x8FC7;n&#x6B21;&#x4F4D;&#x8FD0;&#x7B97;&#x4E3A;&#x51E0;&#xFF0C;y&#x540C;&#x7406;
            if(x>=y) ans|=x<<i; 此时x>=y&#x6EE1;&#x8DB3;&#x4E09;&#x79CD;&#x60C5;&#x51B5;
                        //1.x=0,y=0 &#x65E0;&#x8BBA;&#x539F;&#x6570;&#x6B64;&#x4F4D;&#x586B;0&#x8FD8;&#x662F;1&#xFF0C;&#x90FD;&#x6700;&#x7EC8;&#x4E3A;0&#xFF0C;&#x6240;&#x4EE5;&#x8FD8;&#x662F;&#x586B;0&#x66F4;&#x52A0;&#x5408;&#x9002;
                        //2.x=1,y=0 &#x539F;&#x6570;&#x6B64;&#x4F4D;&#x586B;0&#x4E4B;&#x540E;&#xFF0C;&#x80FD;&#x4F7F;&#x6700;&#x7EC8;&#x7B54;&#x6848;&#x66F4;&#x5927;
                        //3.x=1,y=1 &#x539F;&#x6570;&#x6B64;&#x4F4D;&#x65E0;&#x8BBA;&#x586B;0&#x8FD8;&#x662F;1&#xFF0C;&#x90FD;&#x6700;&#x7EC8;&#x4E3A;1&#xFF0C;&#x90FD;&#x80FD;&#x4F7F;&#x6700;&#x7EC8;&#x7B54;&#x6848;&#x66F4;&#x5927;
                        //&#x4E3A;&#x4EC0;&#x4E48;&#x586B;0&#x66F4;&#x5408;&#x9002;&#xFF0C;&#x5982;&#x679C;&#x9AD8;&#x4F4D;&#x586B;0&#x586B;&#x7684;&#x8D8A;&#x591A;&#x90A3;&#x4E48;&#xFF0C;&#x4F4E;&#x4F4D;&#x80FD;&#x9009;&#x62E9;1&#x7684;&#x53EF;&#x80FD;&#x6027;&#x5C31;&#x66F4;&#x5927;
            else ans|=y<<i,m-=1<<i; 减去填1之后的数,保证原数小于m } else ans|="book(0,i)<<i;//&#x6B64;&#x4F4D;&#x4E3A;0&#xFF0C;&#x539F;&#x6570;&#x53EA;&#x80FD;&#x586B;0&#xFF0C;&#x6700;&#x7EC8;&#x7B54;&#x6848;&#x53EA;&#x80FD;&#x4E3A;&#x7531;0&#x8FDB;&#x884C;&#x4F4D;&#x8FD0;&#x7B97;&#x7684;&#x7ED3;&#x679C;" }cout<<ans<<endl;return 0; < code></i,m-=1<<i;></i;></n;++i){></n;++i){></iostream></cstring></cstdio>

如果牵扯到二进制,直接暴力很有可能tle,可以考虑试着枚举位数,一般都能大大降低时间复杂度

ZFY AK IOI

Original: https://www.cnblogs.com/guiyou/p/15185500.html
Author: 归游
Title: [NOI2014] 起床困难综合症

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/584594/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++虚函数表、多态

    概述 C++的多态在不同环境下实现方式可能不一样,虚函数表是C++实现多态的一种方式。问题: 什么情况下C++会使用虚指针和虚函数表? 如果子类不新增任何虚函数,也不重写父类的虚方…

    数据结构和算法 2023年6月8日
    0110
  • 个人博客迁移到github

    https://github.com/kongshuiJ/blog Original: https://www.cnblogs.com/jiangyibo/p/14714773.h…

    数据结构和算法 2023年6月16日
    0112
  • HTTP与WebSocket/WebDAV

    WebSocket WebDAV posted @2022-06-15 20:37 放飞梦想C 阅读(27 ) 评论() 编辑 Original: https://www.cnbl…

    数据结构和算法 2023年6月8日
    080
  • Iterator与Generator

    Iterator Iterator 概念 Iterator 提供了一种统一的接口机制,为各种不同数据结构提供统一的访问机制。定义 Iterator 就是提供一个具有 next() …

    数据结构和算法 2023年6月12日
    095
  • [Linux] 使用du命令查看文件夹空间使用情况

    本文介绍了在linux下使用 du命令查看文件夹所占空间大小的命令,包括查看当磁盘中所有文件占空间大小、前目录的所占空间大小、当前目录下一级子目录各自所占空间大小等等操作。 1. …

    数据结构和算法 2023年6月7日
    090
  • 【模板】数据结构

    平衡树 点击查看代码 //&#x8D85;&#x7EA7;&#x5168;&#xFF0C;&#x5565;&#x90FD;&…

    数据结构和算法 2023年6月7日
    071
  • 图论的小技巧以及扩展

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月8日
    058
  • 试除法判断约数 和 试除法判断质数

    约数和质数是我们在认识数学问题中经常遇到的两个概念,所以如何判断他们肯定也是我们需要去考虑! 首先我们看一些判断质数: 因为我们可以知道质数的概念指的是这个数只能被1和自身整除,所…

    数据结构和算法 2023年6月7日
    070
  • /proc/meminfo 解释

    posted @2022-02-17 11:46 空水 阅读(25 ) 评论() 编辑←→↓ ↑ Original: https://www.cnblogs.com/jiangyi…

    数据结构和算法 2023年6月16日
    071
  • 做题记录22.3.31 洛谷P2250

    洛谷P2250记录 由于CSDN新增了字数限制,即日起本人开始转战博客园 题目链接 这题我原本的想法是:按先x后y的升序排序,随后对于任意一个i,查找和i+1相交的部分,并在这部分…

    数据结构和算法 2023年6月12日
    093
  • 2022/1/18

    T1 T2 T3 T4 posted @2022-01-18 21:02 小铭同学lym 阅读(15 ) 评论() 编辑 Original: https://www.cnblogs…

    数据结构和算法 2023年6月8日
    091
  • 快速排序及优化

    快速排序 每次从当前考虑的数组中选一个元素,把这个元素想办法挪到应该排好序的位置,比如 4这个元素,它就有一个性质 4之前的元素都是小于它的,之后的元素都是大于它的,之后我们要做的…

    数据结构和算法 2023年6月8日
    0113
  • P4388 付公主的矩形 题解

    简要题意 求有多少矩形对角线经过的方格数为给定的 (n),其中 (R \times C) 和 (C \times R) 视为同一个矩形。 解题思路 首先考虑怎么求一个已知矩形对角线…

    数据结构和算法 2023年6月7日
    068
  • HarmonyOS移动应用学习笔记——1.初识HarmonyOS

    1.1HarmonyOS简介 1.2HarmonyOS架构和安全 HarmonyOS架构 内核层 系统服务层 框架层 应用层 HarmonyOS应用服务智能分发 HarmonyOS…

    数据结构和算法 2023年6月7日
    0123
  • 笛卡尔树

    这里做点总结笛卡尔树有两条性质 二叉搜索树 小根堆 定理:编号权值互不相同的笛卡尔树构造是唯一的 二叉搜索树满足左儿子权值小于父节点,右儿子权值大于父节点 小根堆满足权值小于左右节…

    数据结构和算法 2023年6月7日
    099
  • CF1400E Clear the Multiset 题解

    考虑一个分治:每次如果要用第一种,一定是给整个区间用,直到没有办法覆盖整个区间,用的次数是 (\min_{i=L}^R a_i) 次,减去它之后分别递归最小值的两边。注意到如果某一…

    数据结构和算法 2023年6月12日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球