codeforces 768c Jon Snow And His Favourite Number
题意:
给出一个数列,和一种操作,以及两个数x和k。
这个操作有两个步骤:
首先把这个数列按照升序排序,然后把所有奇数位上的数字与x异或。
问执行k次操作之后,这个数列的最大值和最小值是多少。
思路:
由于每个数字异或两次之后会变回本身,所以猜测这个数列有可能会循环,所以就可以暴力计算周期,对于每一次出现的数列,看看是否与前面某次出现过的数列相同,这是暴力的思路。玄学复杂度。
更优雅的思路:
发现a[i]的最大值为1000,任意1000以内的两个数字异或不会超过1023,所以可以统计0到1023当中每个数字出现的次数,然后利用前缀和的思想,计算这个数字在下一次操作中对其他数字出现次数的贡献。
假设这个数字之前有n个数字出现,这个数字的出现次数为y,当前数字为cur,操作后的数列为nex:
1.当n为偶数,y为奇数:
nex[cur^x] += (y/2)+1;nex[cur] += y/2;
2.当n为偶数,y为偶数:
nex[cur^x] += (y/2);nex[cur] += y/2;
3.当n为奇数,y为奇数:
nex[cur^x] += (y/2);nex[cur] += y/2+1;
4.当n为奇数,y为偶数:
nex[cur^x] += (y/2);nex[cur] += y/2;
这个思路的复杂度为O(k*1024)。
思路1代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <map>
using namespace std; const int N = 1e5 + ;
int a[N],b[][N]; int judge(int cu,int n)
{
for (int i = ;i < cu;i++)
{
bool f = ;
for (int j = ;j < n;j++)
{
if (b[i][j] != b[cu][j])
{
f = ;
break;
}
} if (!f) return i;
} return -;
} int main()
{
int n,k,x; scanf("%d%d%d",&n,&k,&x); for (int i = ;i < n;i++) scanf("%d",&a[i]);
for (int i = ;i < n;i++) b[][i] = a[i]; int cnt = ;
int pre = cnt-; for (;cnt <= k;cnt++)
{
for (int i = ;i < n;i++)
{
b[cnt][i] = b[cnt-][i];
} sort(b[cnt],b[cnt]+n); for (int i = ;i <= n;i+=)
{
b[cnt][i] ^= x;
} pre = judge(cnt,n); if (pre != -) break;
} if (cnt >= k)
{
sort(b[k],b[k]+n); printf("%d %d\n",b[k][n-],b[k][]);
}
else
{
int ti = cnt - pre; k = (k - pre) % ti; k += pre; sort(b[k],b[k]+n); printf("%d %d\n",b[k][n-],b[k][]);
} return ;
}
思路2代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
const int N = ; int a[N];
int pre[N];
int nex[N]; int main()
{
int n,k,x; scanf("%d%d%d",&n,&k,&x); for (int i = ;i < n;i++)
{
int y;
scanf("%d",&y);
a[y]++;
} for (int i = ;i < k;i++)
{
memset(nex,,sizeof(nex));
pre[] = ; for (int j = ;j < ;j++)
{
pre[j] = pre[j-] + a[j-];
} for (int j = ;j < ;j++)
{
if (a[j])
{
if (pre[j] % )
{
if (a[j] % )
{
nex[j^x] += a[j] / ;
nex[j] += a[j] / + ;
}
else
{
nex[j^x] += a[j] / ;
nex[j] += a[j] / ;
}
}
else
{
if (a[j] % )
{
nex[j^x] += (a[j]/) + ;
nex[j] += a[j]/;
}
else
{
nex[j^x] += a[j]/;
nex[j] += a[j]/;
}
}
}
} for (int j = ;j < ;j++)
{
a[j] = nex[j];
}
} int mx,mn; for (int i = ;i < ;i++)
{
if (a[i])
{
mn = i;
break;
}
} for (int i = ;i >= ;i--)
{
if (a[i])
{
mx = i;
break;
}
} printf("%d %d\n",mx,mn); return ;
}
codeforces 768c Jon Snow And His Favourite Number的更多相关文章
- CodeForces - 768C Jon Snow and his Favourite Number 桶排
https://vjudge.net/problem/CodeForces-768C 题意:n个数,k次操作,x.每次操作先排序,再让奇数位置上的数据a[i]:=a[i] XOR x; k< ...
- Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) C - Jon Snow and his Favourite Number
地址:http://codeforces.com/contest/768/problem/C 题目: C. Jon Snow and his Favourite Number time limit p ...
- Codeforces768C Jon Snow and his Favourite Number 2017-02-21 22:24 130人阅读 评论(0) 收藏
C. Jon Snow and his Favourite Number time limit per test 4 seconds memory limit per test 256 megabyt ...
- 【codeforces 768C】Jon Snow and his Favourite Number
[题目链接]:http://codeforces.com/contest/768/problem/C [题意] 给你n个数字; 让你每次把这n个数字排序; 然后对奇数位的数字进行异或操作,然后对新生成 ...
- Jon Snow and his Favourite Number CodeForces - 768C (技巧)
链接 题意 给定数组, 每次操作先将数组排序, 再将奇数位全部异或x, 求k次操作后数组最大值与最小值 (1 ≤ n ≤ 105, 0 ≤ k ≤ 105, 0 ≤ x ≤ 103) 题解 直接暴力模 ...
- codeforces 768 C. Jon Snow and his Favourite Number(思维+暴力)
题目链接:http://codeforces.com/contest/768/problem/C 题意:给出n个数,k个操作,和一个x,每次操作先排序然后对奇数位数进行xor x操作,最后问k次操作后 ...
- 【基数排序】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) C. Jon Snow and his Favourite Number
发现值域很小,而且怎么异或都不会超过1023……然后可以使用类似基数排序的思想,每次扫一遍就行了. 复杂度O(k*1024). #include<cstdio> #include<c ...
- C. Jon Snow and his Favourite Number DP + 注意数值大小
http://codeforces.com/contest/768/problem/C 这题的数值大小只有1000,那么可以联想到,用数值做数组的下标,就是类似于计数排序那样子.. 这样就可以枚举k次 ...
- Codeforces I. Producing Snow(优先队列)
题目描述: C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input stand ...
随机推荐
- Ubuntu 下Anaconda3出现 conda:command not found(未找到命令)
问题:anaconda: command not found解决方案:打开Terminal 1.使用命令:sudo apt install vim 安装vim文本编辑器2.使用命令:vim ~/.ba ...
- CF1103D Professional layer dp
正解:dp 解题报告: 传送门! 首先不难想到求个gcd,然后把gcd质因数分解成p1w1*p2w2*p3w3*...*pmwm 显然只要满足对每个p有一个ai%pj!=0就好,也就是说对每个pj找出 ...
- 1-4-bootloader架构学习
1-4-bootloader架构学习 1.一般情况下嵌入式 Linux 系统中的软件主要分为以下几部分: 1) 引导加载程序:其中包括内部 ROM 中的固化启动代码和 BootLoader 两部分. ...
- dedecms批量删除文档关键词可以吗
这几天在重新整服务器,几个站点都是用dedecms搭建的,版本相对比较早,虽然都已经打了补丁,但客户还是在纠结,所以就下载了新的系统进行搭建(注意编码要和原来的一样),导入数据,一切安好,可发现后台有 ...
- Python3学习之路~5.3 random模块
random模块常用方法: import random # 随机数 print(random.random()) # 生成一个0到1的随机浮点数,0 <= n < 1.0 print(ra ...
- pip批量安装和卸载package
创建文件 将要安装或卸载的包按指定格式保存到文件中,这里以 packages.txt 为例,格式如下: Flask_Script==2.0.6 alembic==1.0.5 SQLAlchemy==1 ...
- localhost/get/user.json localhost/get/user.xml
我也是引入了jackson-dataformat-xml这个依赖,它是提供了jackson将实体类转化为xml相关的作用.而本身jackson是可以将实体类转化为json的,所以这样Jackson是可 ...
- [py]py异常应用
异常执行路径 代码参考 try: text = input('请输入 --> ') except EOFError: print('为什么你按下了EOF?') except KeyboardIn ...
- (转)Springboot邮件服务
springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEASE版本了.准备慢慢在写写springboot相关的文章,本篇文章使用springboot最新版本1.5. ...
- 三维bfs(HUD1253胜利大逃亡)
#include <stdio.h>#include <string.h>int map[51][51][51];int v[51][51][51];int a,b,c,t11 ...