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 ...
随机推荐
- quartz 2.1.6使用方法
/** * @Description: * * @Title: QuartzManager.java * @Package com.joyce.quartz * @Copyright: Copyrig ...
- Webpack 入门(转)
原文:https://www.runoob.com/w3cnote/webpack-tutorial.html Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后将 ...
- oracle如何查看执行计划
1.在PL/SQL Developer中得到一个SQL的执行计划 输入想要查看执行计划的目标SQL,再按一下快捷键F5就可以了.2.explain plan 命令 explain plan for + ...
- Github上Laravel开源排行榜Star数31-60名
Github上Laravel开源排行榜Star数31-60名,罗列所有 Laravel 开源扩展包,含 Github Star 数量,下载数量和项目简介.默认排序是按Star数量从多到少来排 31.c ...
- mysql批量插入数据
建表 create table `dept`( `id` ) unsigned NOT NULL AUTO_INCREMENT, `deptno` mediumint() unsigned ', `d ...
- redgate的mysql架构比较和数据比较工具
redgate的mysql架构比较和数据比较工具 最近线上数据需要进行架构比较,比较两个服务器上的mysql实例上数据库的架构 数据比较可以用percona的pt-table-checksum和pt- ...
- MySQL准入规范及容量评估
一.数据库设计 1.表结构设计 -表中的自增列(auto_increment属性)推荐使用bigint类型 -首选使用非空的唯一键, 其次选择自增列或发号器 不使用更新频繁的列,尽量不选择字符串列,不 ...
- pycharm 如何设置方法调用字体颜色
一.pycharm 如何设置方法调用字体颜色 1.打开pycharm编辑器,file > settings > editor > color scheme > python & ...
- 初识Shell与Shell脚本
初识Shell Shell 是一个用 C 语言编写的程序,Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内 ...
- Jmeter原理
Jmeter结构体系及运行原理 Jmeter结构体系 把Jmeter的结构体系拆分为三维空间,如图: X1~X5:是负载模拟的一个过程,使用这些组件来完成负载的模拟: X1:选择协议,模拟用户请求 ...