首页 > 其他分享 >[ARC173E] Rearrange and Adjacent XOR 题解

[ARC173E] Rearrange and Adjacent XOR 题解

时间:2024-07-19 23:17:59浏览次数:11  
标签:... ch XOR int 题解 Rearrange base define 2k

题目链接

点击打开链接

题目解法

太牛了!!!

这道题我的第一反应是从高位往低位确定,但这样就全错了
换个角度考虑,找最后的答案可以由那些数异或而成

这里给出结论:答案一定是偶数个数的异或和(在 \(n\%4=2\) 且 \(n\neq 2\) 时,不能由全集构成)
证明:

  1. 选出的数非全集的情况
    用数学归纳法
    假设答案选的数为 \(a_1,...,a_{2k}\)(\(2k<n\),顺序无所谓)
    如果 \(k\) 为偶数,我们构造顺序为 \(a_1,a_2,...,a_{2k},a_{2k+1},...,a_n\),下一轮会变成选 \(k\) 个数(\(a_{2i-1}\oplus a_{2i}\;(1\le i\le k)\))的子问题
    如果 \(k\) 为奇数,我们考虑带进来一个不需要的数,构造顺序 \(a_1,a_2,...,a_n,a_{2_k},a_{2k+1},...,a_{n-1}\),下一轮会变成选 \(k+1\) 个数(\(a_{2i-1}\oplus a_{2i}\;(1\le i\le k-1),\;a_{2k-1}\oplus a_n,\;a_{2k}\oplus a_n\))的子问题
  2. 选出的数为全集的情况
    \(n\) 为奇数不用管
    如果 \(n=4k\),我们构造 \(a_1,...,a_n\),下一轮就是选出 \(2k\) 个数的非全集的子问题了
    如果 \(n=4k+2\),考虑证明下一轮必须选出 \(q=2k+1\) 个数
    若 \(q<2k+1\),则数一定选不全
    若 \(q>2k+1\),则数一定会抵消
    所以下一轮选的数为奇数,不合法

如果没有数必须不选的情况考虑线性基,把 \(a_i\oplus a_{i+1}\) 都塞到线性基中,然后选出的数一定是偶数个
有数必须不选的话,不带那个数跑一遍线性基即可

时间复杂度 \(O(n^2\log V)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=110;
int n;
LL a[N],b[N],base[60];
void ins(LL v){
    DF(i,59,0) if(v>>i&1){
        if(!base[i]){ base[i]=v;break;}
        v^=base[i];
    }
}
int main(){
    read(n);
    F(i,1,n) read(a[i]);
    LL ans=0;
    if(n==2||n%4==0) F(i,1,n) ans^=a[i];
    F(i,1,n){
        int len=0;
        F(j,1,n) if(i!=j) b[++len]=a[j];
        ms(base,0);
        F(j,1,len-1) ins(b[j]^b[j+1]);
        LL val=0;
        DF(j,59,0) if(!(val>>j&1)) val^=base[j];
        chkmax(ans,val);
    }
    printf("%lld\n",ans);
    return 0;
}

标签:...,ch,XOR,int,题解,Rearrange,base,define,2k
From: https://www.cnblogs.com/Farmer-djx/p/18312540

相关文章

  • 题解 Codeforces 1994H Fortnite
    首先第一次询问肯定是问\(\texttt{aa}\),答案减去\(1\)得到基数\(p\)。然后我们随意询问一个真实Hash值(取模之前)\(X\)大于模数\(m\)的字符串,例如\(s=\texttt{zzz}\cdots\texttt{zzz}\)(\(50\)个\(\textttz\))。设它取模得到的Hash值是\(a\)。考虑正整数\(1\leqb......
  • CF466E Information Graph 题解
    题目链接LuoguCodeforces题意简述某公司中有\(n\)名员工。为方便起见,将这些员工从1至\(n\)编号。起初,员工之间相互独立。接下来,会有以下\(m\)次操作:员工\(y\)成为员工\(x\)的上司。保证此前\(x\)没有上司。员工\(x\)拿到一份文件并签字,随后交给他的上司......
  • P3206 城市建设 题解
    Statement动态边权的最小生成树。\(n\le2\cdot10^4,m,q\le5\cdot10^4\)Solution法一:改边权相当于删一条边再加一条边.考虑LCT维护最小生成树,加边好做,但删边比较麻烦,于是采用线段树分治,撤销一条边是好做的,cut再link一下就行了.\(O(n\logn\logq)\),常数较大.法二:两个结......
  • 07-19 题解
    07-19题解B思路实质:有一个完全图,删掉一些边,然后在图上找一棵生成树但是图的边数是\(n^2\)级别的,极其稠密找生成树的步骤:从一个点开始,把与它相连的,不在同一连通块的点连在一起所以我们只要确保每次都能在尽量少的步数内找到一个合法点一共有n个点,确定一个点之......
  • 2024年牛客暑期多校训练营1 A题 A Bit Common题解
    题目的大意:首先,给你一个长度为n的序列A,A序列中每一个元素全都小于2m,并且大于等于0。A序列要满足存在一个非空子序列的与运算(&)和为1;输出这样的A序列有几个,最后对正整数q取模。(1<=n,m<=5000,1<=q<=109)输入只有一行n,m,q,输出包含一个整数。 题解:要满......
  • [NOI2007] 项链工厂 题解
    前言题目链接:洛谷;Hydro&bzoj。题意简述yzh喜欢写DS题!你要维护一个环:顺时针移动\(k\)位;翻转\(2\simn\);交换\(i\)与\(j\);区间覆盖;查询整个环有几个颜色段;查询\(i\simj\)有几个颜色段。题目分析平衡树板子啊,代码很好写,\(273\)行。但是为什么不使用线......
  • 1004:字符三角形 题解
    题目链接题目描述给定一个字符,用它构造一个底边长\(5\)个字符,高\(3\)个字符的等腰字符三角形。解题思路由于是字符,我们需要定义一个char类型的字符变量。第一行为两个空格和一个字符第二行为一个空格和三个字符第三行是五个字符输出即可ACCode#include<bits/stdc++.h......
  • 1003:对齐输出 题解
    题目链接题目描述读入三个整数,按每个整数占\(8\)个字符的宽度,右对齐输出它们,按照格式要求依次输出三个整数,之间以一个空格分开。解题思路由于我们不知道这个数有多大,所以我们可以用printf自带的占位符%xd输出,其中x为位数。例:printf("%3d",a);就是占用3位。题目要求为\(8\)位......
  • 1001:Hello,World! 题解
    题目链接题目描述编写一个能够输出“\(\mathtt{Hello,World!}\)”的程序,这个程序常常作为一个初学者接触一门新的编程语言所写的第一个程序,也经常用来测试开发、编译环境是否能够正常工作。提示:“\(\mathtt{Hello,World!}\)”中间没空格。解题思路梦开始的地方\(Ver3.0\)没......
  • 暑假集训CSP提高模拟1考试题解
    A.Start洛谷原题链接一道大模拟,赛时20pts。教授の高光时刻-输出没加句号、空格。-C++向0取整。-DOUBLE没传递。--9操作成-1(复制粘贴导致的)。-负数位运算卡常。其实这题还是比较简单的,细节在题目中讲的很详细,跟着它说的去做就好了。我的方法是把每个玩家用一个结构......