Luogu P2114/ACAG 0x01-5 起床困难综合征 本题的关键之处在于,题目中给定的三种位运算--AND,OR,XOR,在二进制下皆是不进位的.这说明每一位都是独立的,启发我们可以按位考虑. 因此我们从最高位向最低为依次考虑,每一位应该填$0$还是$1$. 因为题目中$m \leq 10^9$,所以最多有$30$位.($10^9<2^{30}-1$) 对于第$k$位(最低位为第$0$位),改为应该填$1$,当且仅当满足下列两个条件: 已经填好的更高位构成的数值加上$2^k (1<&…
题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生,每一位之间相互独立.因此,可以从高到低依次考虑每一位对答案的贡献值,计算每一位经过这 N 个操作后的值,比较后更新答案贡献即可. 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; int n,m;…
从高位到低位按位枚举,贪心.如果该位填1比填0结果优且填1不会超出m限制,那就填1,否则填0 /*by SilverN*/ #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; ; int n,m; ]; int op[mxn],a[mxn]; ; int pro(int x){ ;i<=n;i++){ )x=x&a[…
题目链接 这题真是恶心死我了. 由于位运算每一位互不干涉,所以贪心由大到小选择每一位最优的解,但是要判断一下边界,如果选择该解使得原数>m则不能选择. 代码如下 #include<cstdio> #include<cstring> #include<cctype> inline long long read(){ ,f=; char ch=getchar(); while(!isdigit(ch)){ ; ch=getchar(); } while(isdigit…
呃...这道题算是noi中比较简单的题吧...... 众所周知,位运算是个好东西,它就是对应的位进行运算,跟其他的位没有关系. 我们要选取一个m值使最后的攻击力最大,对于这个m,从高位开始枚举,判断该位选0更优还是选1更优,怎么判断呢?把该位进行n次运算不就行了吗,看最后的数是1还是0. .................位运算中的DP? 1 #include<bits/stdc++.h> 2 using namespace std; 3 pair<string,int> a[10…
Description: 有n扇门,每扇门上有一个位运算符(&,|,^) 和一个权值,要求合理的选择一个不超过m的数,使其按顺序经过这些门的运算后最大 Hint: \(n \le 10^5\) Solution: 考虑拆位,分别令每一位一开始是0/1,经过运算后得到的是什么 然后从高位贪心,若运算后为1,则考虑选对应开始时这一位 若此时对应初始值为0,则直接更新答案 若为1,要检验是否还能选,若能,就把m减去它 #include <map> #include <set> #…
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3668 [算法] 从高位向低位贪心即可 时间复杂度 : O(30N) [代码] #include<bits/stdc++.h> using namespace std; #define MAXLOG 30 ; int n,m,ans; int value[MAXN],t[MAXN]; ]; template <typename T> inline void read(T…
传送门:https://www.luogu.org/problem/show?pid=3613 [题解] 按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做. 写棵LCT,维护正反两种权值,每个维护2种,代表全0的输出和全1的输出. 然后直接上LCT即可. 权值的合并有点trick,可以参考代码,需要压位. # include <stdio.h> # include <string.h> # include <iostream> # include <a…
传送门 题意:给出一个$N$个点的树,树上每个点有一个位运算符号和一个数值.需要支持以下操作:修改一个点的位运算符号和数值,或者给出两个点$x,y$并给出一个上界$a$,可以选取一个$[0,a]$内的整数值,在从$x$到$y$的路径上,每走到一个点就与这个点对应的数值进行对应的位运算,求到达$y$点时数字的可能的最大值.$N,\text{操作数} \leq 10^5$,数字在$unsigned long long$范围内. 可以先去做NOI2014的起床困难综合征 考虑用起床困难综合征的贪心策略…
起床困难综合征 bzoj-3668 Noi-2014 题目大意:题目链接. 注释:略. 想法:Noi考这题...联赛T1难度.... 我们将每个门上的数二进制拆分. 发现:当前位的操作可能直接确定了当前位的数字. 即:如果当前位上是0,操作是&,那么这一位无论开始的数是多少,都会变成1.同理如果当前位是1,操作是|,那么这位一定会变成1. 然而如果当前操作和位上的数不能直接确定当前的数,那么我们发现当前的数一定是由初始给定的数确定的. 也就是说我们维护一个数,这个数二进制拆分后,每一位可能是0.…