首页 > 其他分享 >Educational Codeforces Round 134 (Div.2) D 题解

Educational Codeforces Round 134 (Div.2) D 题解

时间:2023-11-02 18:12:11浏览次数:40  
标签:Educational ok cnt auto int 题解 Codeforces ans 序列

题目链接

D. Maximum AND

题目大意

给定两组序列 \(a\) \(b\),长度为 \(n\) ,现有一新序列 \(c\),长度也为 \(n\) 。
其中,\(c_i = a_i \oplus b_i\) 。
定义 \(f(a,b) = c_1\&c_2\&……\&c_n\)。
现在你可以随意编排 \(b\) 序列的顺序,求 \(f(a,b)\) 的最大值。

思路

以下位运算均是二进制。

由于按位与的运算结果是越来越小的,考虑从高位往低位贪心。
将结果的其中一位定为1之后,有一些序列 \(b\) 中的元素的位置就被定下来了。
所以我们要从高位往低位贪心,有一位可以置为1,就把它置为1.

具体做法:暴力枚举,时间复杂度\(O(nlognlogA)\),其中 \(A\) 是输入序列的最大值。

void solve() {

	cin >> n;

	a = vector<int> (n);
	b = vector<int> (n);

	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}

	for (int i = 0; i < n; ++i) {
		cin >> b[i];
	}
	
	auto check = [&](int ans){
		//ans是一个2的整次幂
		map<int,int> cnt;
		//下面两个for是 判断该位上、a序列的1和b序列的0的个数是否相等。
		for(auto x:a) cnt[x & ans] += 1;
		for(auto x:b) cnt[~x & ans] -= 1;
		bool ok = true;
		//如果有1,证明不等,ok置为false
		for(auto [u,v] : cnt){
			ok &= v == 0;
		}
		return ok;
	};
	
	int ans = 0;
	for(int j = 30; j >= 0; --j){
		//从高位向低位检查。
		//写博客的时候的思考:如何把之前的已经确定了的1保存下来
		//答:其实就保存在ans中。
		if(check(ans | (1ll << j))){
			ans |= 1 << j;
		}
	}

	cout << ans << '\n';
}

标签:Educational,ok,cnt,auto,int,题解,Codeforces,ans,序列
From: https://www.cnblogs.com/DanRan02/p/17805971.html

相关文章

  • Educational Codeforces Round 128 (Rated for Div. 2)
    添加链接描述C题显然二分0的数量,然后双指针,算一下前缀和后缀1的数量即可。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<map>#include<vector>#include<set>#defineAputs("YES")#defineBputs("NO&q......
  • 【python】-bash: /usr/local/bin/pip: /usr/bin/python: bad interpreter: No such f
    安装单独的第三方库时没有问题pipinstallpandas但是一旦使用requirement.txt批量安装第三方库时就会出现-bash:/recorddata/rebuydata/hppy/soft/python3/bin/pip3:/usr/local/source/hppy/soft/python3/bin/python3.6:badinterpreter:没有那个文件或目录badinterpreter......
  • CF1868B1 Candy Party (Easy Version) 题解
    Problem-1868B1-CodeforcesCandyParty(EasyVersion)-洛谷喵喵题。首先每个数最终肯定变成\(\overlinea\),如果\(\overlinea\)不是整数显然无解。然后记\(b_i=a_i-\overlinea\)表示每个数的偏差量,那\(b_i\)要满足能写成\(2^x-2^y\)的形式然后只需要......
  • abc194f O(nk)题解
    前言洛谷唯一的题解似乎是\(O(nk^2)\)的,怎么卡过去的orz这里提供一种与AT官方题解时间复杂度相同的\(O(nk)\)做法。Solution题意很显然,就不解释了。一眼丁真,考虑数位dp。设\(dp_{i,j}\)表示做到第\(i\)位,不同的个数有\(j\)种的方案数。显然有转移方程:\(dp_{i......
  • Codeforces Round 906 (Div. 2)
    CodeforcesRound906(Div.2)比赛链接A.Doremy'sPaint3题目链接判断给定的数组是不是满足a1+a2=a2+a3=a3+a4=......=an-1+anA思路:这个题一开始没有读仔细问题,导致一时间出错了,后来读清楚问题之后发现其实这个数组中只能出现两个数字,且两个数字之间的差值最多是1A代码:......
  • [ARC159F] Good Division 题解
    [ARC159F]GoodDivision题解首先对于题目要求的划分方式转化一下,转化为划分的每一段都没有绝对众数,可以证明这与题目中的要求是完全等价的,证明如下:充分性:考虑构造一种操作方法,就是每次操作都消去一个出现次数最多的数,按照这样操作可以保证每次操作之后该区间仍然不会出现绝对......
  • 10.30 CF1685 题解
    10.30CF1685A.CircularLocalMiniMax题意给你\(n\)个整数$a_1,a_2,\ldots,a_n$。问有没有可能将它们排列在一个圆上,使每个数字严格地大于其相邻的两个数字或严格地小于其相邻的两个数字?题解直接排序然后按照\(1,4,2,5,3,6\)的规律放,check一下合不合法就行了。......
  • 题解:[SCOI2008] 城堡
    应该是联赛前最后一次任性了,浪费的时间有点多,不过也揭露了我的基础知识和代码能力都很弱的问题,得加油啊。先stodwt。给定一棵基环树森林,起初有\(m\)个点已被选进\(S\)里,你需要再选\(k\)个点加入到\(S\)中,最小化其余点到\(S\)距离的最大值。这个问题直接做非常困难,......
  • Luogu P3862 数圈 题解
    看数据范围——题记传送门考虑记\(f_i\)表示有\(i\)个点的完全图的圈数\(g_i\)表示有\(i\)个点的完全图中一个点到另一个点不同路径的方案数\(ans\)表示答案容易知道递推式\[f_i=g_{i-1}\timesC_{i-1}^2+f_{i-1}\]\[g_i=g_{i-1}\times(i-2)+1\]\[ans=f_{n-......
  • Codeforces Round 907 (Div. 2) B. Deja Vu(二分+后缀和+位运算)
    CodeforcesRound907(Div.2)B.DejaVu思路:预处理31位的\(2^x\)存在\(tmp_i\)对于输入\(a_i\),通过查找最后一个二进制1位置,存在\(x0_i\)由题意可知,对于输入的\(x\),如果有\(a_i\)可整除\(x\),则会使\(a_i\)加上\(2^{x-1}\)所以之后除非是\(x-1\),否则无效,因此把输入\(x\)......