朋友题解

题解

题目传送门

1.题目分析

这道题是一道经典的邻项交换题。很明显,我们会发现,在\(a\)的位置都不变时,我们如果交换相邻的两个\(b\)就会发现这样做只影响了这两对朋友交友后的快乐值。具体地,如果\(a_i\)\(a_{i+1}\)的值不变,交换\(b_i\)\(b_{i+1}\),就只会改变\(a_i \oplus b_i\)\(a_{i +1}\oplus b_{i+1}\)的值。

2.实现方法

有了上面的分析,我们不难发现,如果\(a_i\oplus b_i+a_{i+1}\oplus b_{i+1}<a_i\oplus b_{i+1}+a_{i+1}\oplus b_i\)时,我们就交换\(b_i\)\(b_{i+1}\)

3.代码

\(Code:\)

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
const int N=1E6+5;
int n;
long long a[N],b[N];
struct node{
	long long id,val;
}c[N];
bool cmp(const node&u,const node&v){
	return (a[u.id]^u.val)+(a[v.id]^v.val)>(a[u.id]^v.val)+(a[v.id]^u.val);
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
		c[i].id=i;
		c[i].val=b[i];
	}
	sort(c+1,c+n+1,cmp);
	long long ans=0;
	for(int i=1;i<=n;i++){
		ans+=(a[c[i].id]^c[i].val);
	}
	cout<<ans;
}

posted @ 2022-07-28 12:57  [/]码农1号[/]  阅读(35)  评论(0)    收藏  举报