XOR Inverse
zacharyzhong · · 题解
这题,就是一道和这题一样的暴力题!
——Zachary_zhong
C1 题意
首先,想要A(shou)C(wan)这题,想法很简单,不就是把x从1枚举到
C2 细化
然后,我们考虑优化,发现可以把原来的
C3 Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[500009],ans,tmp[500009],b[500009];
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void my_sort(int l,int r)
{
int mid=(l+r)/2,nl=l,nr=mid+1,tmpp=l;
if(l==r) return;
else
my_sort(l,mid),
my_sort(mid+1,r);
while(nl<=mid&&nr<=r)
if(a[nl]<=a[nr])
tmp[tmpp++]=a[nl++];
else
tmp[tmpp++]=a[nr++],ans+=mid-nl+1;
while(nl<=mid)
tmp[tmpp++]=a[nl++];
while(nr<=r)
tmp[tmpp++]=a[nr++];
for(int i=l;i<=r;i++)
a[i]=tmp[i];
}
inline void fy()
{
for(int i=1;i<=n;i++)
a[i]=b[i];
}
signed main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read(),b[i]=a[i];
int minn=INT_MAX,num=0;
my_sort(1,n);minn=ans;
fy();
for(int i=31;i>=0;i--)
{
ans=0;num+=(1ll<<i);
for(int j=1;j<=n;j++)
a[j]=a[j]^num;
my_sort(1,n);
fy();
if(ans<minn) minn=ans;
else num-=(1ll<<i);
}
cout<<minn<<' '<<num<<endl;
return 0;
}
C4 后记
交这题的时候CF炸了,结果题目评测时一遍过,另外,这题必须卡常,我平均每个测试点有