Codeforces 1722G 结论:异或性质

该博客介绍了如何根据数学性质x⨁(x−1)=1来构造一个无重复元素的数组,使得奇数位次和偶数位次的元素异或和相等。通过分析余数情况,分别处理n%4=1、2、3的情况,给出具体的构造方法。以n=6为例,展示了不同余数下的数组构造实例。文章适合对算法和数组构造感兴趣的读者。
题意:

给定nnn,构造一个无重复元素的数组,使得奇数位次的元素的异或和等于偶数位次的元素的异或和,并且元素≤231\leq 2^{31}231

方法:

有一个这样的性质:对于正奇数xxxx⨁(x−1)=1x \bigoplus (x-1)=1x(x1)=1

那么每四个我们就可以构造这样的数组:x,x+2,x+1,x+3x,x+2,x+1,x+3x,x+2,x+1,x+3,并且使xxx为偶数,这样就可以使这个子数组的奇偶位次异或和为1,那么只需要重复构造这样的四元组。

但未必n%4==0n\%4==0n%4==0,考虑余数rrr

r==1r==1r==1,我们只需要再异或上0即可,也就是最开始的xxx需要稍微大一些

r==2r==2r==2,前面每个四元组奇偶位次异或和一定是1,那么前面所有的四元组的组合奇偶位次异或和就是1或0,我们要满足这样的条件只能补上两个0,这样存在了重复元素,不符。

r==3r==3r==3,我们只需要补上这样的三元组:2 1 32\ 1\ 32 1 3即可

由于r==2r==2r==2不便构造余数数组,题目给了一些构造,发现6的情况刚好是4+2,也就是当r==2r==2r==2时,我们少构造一个四元组,最后把样例n=6n=6n=6的补上即可。

样例n=6n=6n=6时,一个可能的数组为4 1 2 12 3 84\ 1\ 2\ 12\ 3\ 84 1 2 12 3 8

#include<bits/stdc++.h>
#define ll long long
using namespace std;

int n;

void work()
{
	scanf("%d",&n);
	vector<int>ans;
	int k=n%4;
	if(k==1)
	{
		n-=k;
		int now=6;
		while(n)
		{
			ans.push_back(now);
			ans.push_back(now+2);
			ans.push_back(now+1);
			ans.push_back(now+3);
			now+=4; n-=4;
		}
		ans.push_back(0);
	}
	else if(k==2)
	{
		n-=k; n-=4;
		int now=30;
		while(n)
		{
			ans.push_back(now);
			ans.push_back(now+2);
			ans.push_back(now+1);
			ans.push_back(now+3);
			now+=4; n-=4;
		}
		//4 1 2 12 3 8
		ans.push_back(4);
		ans.push_back(1);
		ans.push_back(2);
		ans.push_back(12);
		ans.push_back(3);
		ans.push_back(8);
	}
	else if(k==3)
	{
		n-=k;
		int now=6;
		while(n)
		{
			ans.push_back(now);
			ans.push_back(now+2);
			ans.push_back(now+1);
			ans.push_back(now+3);
			now+=4; n-=4;
		}
		ans.push_back(2);
		ans.push_back(1);
		ans.push_back(3);
	}
	else
	{
		int now=6;
		while(n)
		{
			ans.push_back(now);
			ans.push_back(now+2);
			ans.push_back(now+1);
			ans.push_back(now+3);
			now+=4; n-=4;
		}
	}
	for(int i=0;i<ans.size();i++) printf("%d ",ans[i]); cout<<endl;
}

int main()
{
	// freopen("in.txt","r",stdin);
	int t; cin>>t;
	while(t--) work();
	return 0;
}

请使用c++解决以下问题: ## 题目描述 给定长度为 $n$ 的正整数序列 $a$,求 $g(a)$ 的值: $$ g(a)=\max_{a'}\{f(a')\}\\ f(a)=\sum_{i=2}^{n} |a_{i}-a_{i-1}| $$ 其中,$a'$ 是序列 $a$ 经过任意重排后得到的任意一个序列。 但是这实在是一个三岁小宝宝都会的简单题,因此你想对 $m$ 个序列都求出上述式子的最大值,这 $m$ 个序列满足以下条件。 - 第 $i$ 个序列 $p_i$ 长度为 $i$。 - 第一个序列 $p_1$ 为 $[b'_1=b_1]$。 - 第 $i$($2\leq i\leq m$)个序列 $p_i$ 满足:对于任意满足 $1\leq j<i$ 的正整数 $j$ 满足 $p_{i,j}=p_{i-1,j}$,且 $p_{i,i} = b'_i=b_i\oplus (T\cdot f(p_{i-1}))$。 其中,$\oplus$ 表示二进制按位异或。 ## 输入格式 第一行两个非负整数 $m$ 和 $T$,分别表示你需要求出重排后 $f$ 最大值的序列个数以及生成序列参数。 第二行 $n$ 个非负整数表示 $b_1,\dots,b_m$。 **注意:【数据范围】一节仅对 $b'_i$ 的范围做出了保证,没有对 $b_i$ 的范围做出保证。** ## 输出格式 共一行一个非负整数,为 $\oplus_{i=1}^{m} g(p_i)$。 ## 输入输出样例 #1 ### 输入 #1 ``` 5 0 1 2 3 4 5 ``` ### 输出 #1 ``` 14 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 8 0 5 2 7 1 4 3 8 6 ``` ### 输出 #2 ``` 2 ``` ## 说明/提示 **【样例解释 #1】** $g(p_1),g(p_2),\dots,g(p_m)$ 分别为 $0,1,3,7,11$。 令 $p'_i$ 为 $p_i$ 重排后**任意**满足 $f(p'_i)$ 最大的序列。 $p_1=[1]$,$p'_1=[1]$,$f(p'_1)=0$。 $p_2=[1,2]$,$p'_2=[1,2]$,$f(p'_2)=|1-2|=1$。 $p_3=[1,2,3]$,$p'_3=[1,3,2]$,$f(p'_3)=|1-3|+|3-2|=3$。 $p_4=[1,2,3,4]$,$p'_4=[3,1,4,2]$,$f(p'_4)=|3-1|+|1-4|+|4-2|=7$。 $p_5=[1,2,3,4,5]$,$p'_5=[4,2,5,1,3]$,$f(p'_5)=|4-2|+|2-5|+|5-1|+|1-3|=11$。 该样例满足测试点 $1$ 的限制。 **【样例解释 #2】** $g(p_1),g(p_2),\dots,g(p_m)$ 分别为 $0,3,8,15,17,19,27,31$。 该样例满足测试点 $3$ 的限制。 **【数据范围】** 对于全部测试点:$1\leq m\leq 3\times 10^6$,$1\leq b'_i\leq 10^9$,$T\in \{0,1\}$。 | 测试点编号 | $m\leq$ | $T=$ | 特殊性质 | | :---------: | :------------: | :--: | :------: | | $1$ | $8$ | $0$ | AB | | $2$ | $100$ | $0$ | AB | | $3$ | $10^3$ | $0$ | AB | | $4$ | $2\times 10^5$ | $0$ | AB | | $5$ | $2\times 10^5$ | $0$ | A | | $6$ | $2\times 10^5$ | $1$ | AB | | $7$ | $2\times 10^5$ | $1$ | A | | $8$ | $2\times 10^5$ | $1$ | 无 | | $9$ | $10^6$ | $1$ | 无 | | $10$ | $3\times 10^6$ | $1$ | 无 | 特殊性质 A:$b'_i\leq m$($1\leq i\leq m$)。 特殊性质 B:$b'_i\neq b'_j$($1\leq i<j\leq m$)。
最新发布
10-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值