CodeForces - 768C Jon Snow and his Favourite Number —— 規律題
阿新 • • 發佈:2018-11-12
題意:
進行操作,將數列排序,奇數位上的數與x異或,問重複進行k次操作,得到的數列中最小和最大值是多少
思路:
多找幾個數模擬一下可以看出是有迴圈節存在的,就直接暴力找迴圈節,然後取一下模
#include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <map> #include <set> #include <stack> #include <queue> #include <string> #include <cstring> #include <algorithm> using namespace std; #define ll long long #define max_ 200100 #define mod 1000000007 #define inf 0x3f3f3f3f #define eps 1e-9 int n,k,x; int num[100][100100]; bool check(int x,int y) { for(int i=1;i<=n;i++) { if(num[x][i]!=num[y][i]) return false; } return true; } int main(int argc, char const *argv[]) { scanf("%d%d%d",&n,&k,&x); for(int i=1;i<=n;i++) scanf("%d",&num[0][i]); sort(num[0]+1,num[0]+1+n); int pre=-1,now=-1; for(int i=1;i<=k;i++) { for(int j=1;j<=n;j++) { if(j&1) num[i][j]=(num[i-1][j]^x); else num[i][j]=num[i-1][j]; } sort(num[i]+1,num[i]+1+n); for(int j=i-1;j>=1;j--) { if(check(i,j)) { pre=j; now=i; break; } } if(pre!=-1) break; } if(pre!=-1) { k=(k-(pre))%(now-pre)+pre; } int maxx=-1,minn=inf; for(int i=1;i<=n;i++) { if(num[k][i]>maxx) maxx=num[k][i]; if(num[k][i]<minn) minn=num[k][i]; } printf("%d %d\n",maxx,minn ); return 0; }