首页 > 其他分享 >题解:Maximum AND

题解:Maximum AND

时间:2024-10-24 20:22:18浏览次数:6  
标签:sort read 题解 Maximum int include define

Problem Link

Maximum AND

题外话

sort 肘过去了?

题面翻译

给定数组 \(a\) 和 \(b\),重排 \(b\) 数组,求 \(a_i \oplus b_i\) 之后与和的最大值。

Solution

不难想到按位贪心。从最高位开始,逐位讨论是否能为 \(1\)。

接下来有一个做法:

先将 \(a\) 数组升序排序, \(b\) 数组降序排序。为什么这么排?因为这样最高位越容易异或成 \(1\)。

接下来按位计算,如果可以使该位值为 \(1\),那么就让答案加上该位,反之,跳过该位,除去该位影响后再排序,具体怎么做到?很简单,所有 \(a_i\) 和 \(b_i\) 都把这位变为 \(1\) 或 \(0\) 即可。

Code

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <string.h>
#include <cstring>
using namespace std;

typedef long long ll;
#define Maxn 100005
#define Maxlen 30
#define fo(i, l, r) for (int i = l; i <= r; ++i)
#define fr(i, r, l) for (int i = l; i >= r; --i)
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21], *p1 = buf, *p2 = buf;
inline int read(int x=0, bool f=0, char c=getchar()) {for(;!isdigit(c);c=getchar()) f^=!(c^45);for(;isdigit(c);c=getchar()) x=(x<<1)+(x<<3)+(c^48);return f?-x:x;}

int n, a[Maxn], b[Maxn], ans;

bool smaller(int a, int b) { return a < b; }

bool bigger(int a, int b) { return a > b; }

int main()
{
    int _ = read();
    while(_--)
    {
        n = read(); ans = 0;
        fo(i, 1, n) a[i] = read();
        fo(i, 1, n) b[i] = read();
        sort(a + 1, a + n + 1, smaller),
        sort(b + 1, b + n + 1, bigger);
        fr(pos, 0, Maxlen) { // 从高到低位考虑。
            bool could_be_one = true; int pos_num = (1 << pos);
            fo(i, 1, n) if( (a[i] & pos_num) == (b[i] & pos_num) ) { could_be_one = false; break; }
            if( could_be_one ) ans |= pos_num; // 可以,则加上该位
            else // 不可以
            {
                fo(i, 1, n) a[i] |= pos_num, b[i] |= pos_num; // 把所有数的该位都变为 1 。
                sort(a + 1, a + n + 1, smaller), 
                sort(b + 1, b + n + 1, bigger); // 重新排序。
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

Tips

没有。硬要说的话,\(ans\) 多测要清为 \(0\)?

标签:sort,read,题解,Maximum,int,include,define
From: https://www.cnblogs.com/naughty-naught/p/18500396

相关文章

  • AtCoder Regular Contest 185 题解
    A-modMGame2第一个观察是如果一个人手中还有2张牌,那么他一定不会被秒。这可以推出决定胜负的时刻一定是Alice和Bob手中只剩一张牌的时候,此时如果Alice被秒了,那么她就似了,否则她就赢了。考虑Alice什么时候能被秒。记决定胜负的时刻Alice手中的牌是\(a\),Bob手......
  • 23~24 炼石计划 NOIP 练习题部分题解
    目录目录第1组JOISC2017火车旅行IOI2018会议CF1558FStrangeSortAPIO2018新家CTSC2017密钥CF1748EYetAnotherArrayCountingProblem第2组NOI2016区间LOJ552MIN&MAXIJOISC2023合唱LOJ542序列划分LOJ560Menci的序列P8978中位数第3组USACO20FEBHelpYourse......
  • CF35C. Fire Again 题解 bfs求最短路
    题目链接:https://codeforces.com/problemset/problem/35/C视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp/?p=4以每个着火的点为起点求最短路,然后输出任意一个距离值最大的点即可。需要注意的是:本题是文件输入输出。示例程序:#include<bits/stdc++.h>usingnamespace......
  • CF1139C. Edgy Trees 题解 并查集
    题目链接:https://codeforces.com/problemset/problem/1139/C视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp?p=3我们可以求总方案数-不满足条件的方案数。设一个不包含黑色边的极大连通块的大小为\(sz_i\)。则答案为\[n^k-\sum\{sz_i^k\}\]示例程序:#include......
  • CF1800E2. Unforgivable Curse (hard version) 题解 并查集
    题目链接:https://codeforces.com/contest/1800/problem/E2视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp?p=2把下标\(i\)对应到图中编号为\(i\)的节点。节点\(i\)和\(i+k\)之间连一条边,节点\(i\)和\(i+k+1\)之间也连一条边。同一个连通块里的节点对应的字......
  • P5661 [CSP-J2019] 公交换乘 题解
    模拟"公交换乘"按题意模拟即可.注意:可以使用结构体,但是超过时间的优惠券需要被忽略.代码#include<iostream>#include<cstdio>usingnamespacestd;structnode{ intprice,deadline,is_use;//价格,截止时间,是否使用过}a[100005];intn,p,ans,pos=1;int......
  • P5662 [CSP-J2019] 纪念品 题解
    背包因为小伟可以每天进行$2$种操作无限次,所以显然可以使用完全背包.定义状态$f_i$,表示还剩下$i$时,可以拿到钱的最大值.再假设小伟今天买了,明天就卖掉.状态转移方程如下:$f_i=max(f_i,f_{i-p_{k,i}}+p_{k+1,i}-p_{k,i}).$即今天花掉的钱+明天能拿的钱-今天花掉的......
  • P5663 [CSP-J2019] 加工零件 题解
    最短路对于上图,如果我们相知道$2$号工人想要一个$3$阶段的零件,其实是看$2$到$1$有没有一条长度为$3$的路径.但如果要求$4$阶段的路径,那就不一定了.所以我们直接求一遍最短路,分奇最短路和偶最短路.处理完后,最后一次$\Theta(1)$的回答,如果路径长度过大,就是$No$,......
  • Nginx的 MIME TYPE问题导致的mjs文件加载出错的问题解决
    .mjs文件:明确表示使用ES6模块系统(ECMAScriptModules)。 在服务器用Nginx部署前端项目后,出现下面这种问题Failedtoloadmodulescript:ExpectedaJavaScriptmodulescriptbuttheserverrespondedwithaMIMEtypeof"application/octet-stream".StrictMIMEt......
  • P1668 USACO04DEC Cleaning Shifts S 题解
    P1668USACO04DECCleaningShiftsS-洛谷分析这道题最快的做法应该是贪心,但是线段树优化DP也可以做。首先看到此题,可以想到一个很暴力的区间DP:\(f[i][j]\)表示在\([i,j]\)时段内最少需要的奶牛数量。对于每头牛的空闲时段\([l,r]\),其每个子区间答案均为\(1\);对于......