Codeforces 768C Jon Snow and his Favourite Number 构造

来源:互联网 发布:软件实施外包合同 编辑:程序博客网 时间:2024/06/05 14:35

点击打开链接

题意:n个数字 k次操作(n,k<=1e5)每次将数组排好序后,令a[i]=a[i]^x (ai,x<=1e3,i=1,3,5,7..) 求k次操作后的最大值和最小值

注意到每次操作时都将数组排序,ai,x<=1e3 所以最值在[0,1023]之间
令f[y]为y的出现次数 只要知道每次多少个y保持不变 多少个y变为y^x 重复k次后,求出答案 O(k*1024) 

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e5+20;int n,k,x,a[N],f[N],t[N];int main(){while(cin>>n>>k>>x){memset(f,0,sizeof(f));memset(t,0,sizeof(t));int mn=1e9,mx=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);f[a[i]]++;}for(int i=1;i<=k;i++){int s=0;//当前比j小的个数 for(int j=0;j<1024;j++)t[j]=f[j];for(int j=0;j<1024;j++){ if(f[j]){int change=f[j]/2;if(s%2==0&&f[j]%2)change++; t[j^x]+=change;t[j]-=change;s+=f[j];}}for(int j=0;j<=1023;j++)f[j]=t[j];}for(int i=0;i<1024;i++){if(f[i]){mn=min(mn,i);mx=max(mx,i);}}cout<<mx<<' '<<mn<<endl;}return 0;}


0 0
原创粉丝点击