codeforces 460D Little Victor and Set(构造、枚举)
最近的CF几乎都没打,感觉挺水的一个题,不过自己仿佛状态不在,看题解才知道做法。
输入l, r, k (1 ≤ l ≤ r ≤ 1012; 1 ≤ k ≤ min(106, r - l + 1)).
从[l,r]选至多k个数使得选出的数的异或值最小,输出最小异或值和方案。
分类讨论,首先如果r-l+1<=4,枚举集合解决之。
先面讨论r-l+1>=5的情况:
此时有至少5个数可以选择,故至少有连续的4个数满足2x,2x+1,2x+2,2x+3。
k==1时显然方案为{l}。k==2时,显然方案为{2x,2x+1}。k>=4时,显然方案为{2x,2x+1,2x+2,2x+3}。
k==3时再另外考虑:
首先,异或值至多为1(参考k==2)
我们现在来找异或值可否为0。先假设可以,则显然是选3个数。不妨设x>y>z。
111...1111
111...1110
000...0001
显然x,y,z前半部分必定是如上这样的,但由于我们要使得x,y,z尽量靠近,所以x,y,z前半部分必然是如下
11
10
01
之后,每添加一位,有可能是yi=zi=1,xi=0或xi=zi=1,yi=0或xi=yi=1,zi=0。
由于要x,y,z尽量靠近,所以显然采取yi=zi=1,zi=0。
所以x,y,z的二进制形式如下
110...0
101...1
011...1
至此,问题大致解决,剩下的就是些细节问题,问题不大。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std; #define ll long long int cnt(int i){
int ret=0;
while(i) i-=i&(-i), ++ret;
return ret;
}
int main(){
ll l,r;
int k;
while(~scanf("%I64d%I64d%d",&l,&r,&k)){
if(r-l+1<5){
int n=r-l+1;
ll ansxor=1ll<<60;
vector<ll>val;
for(int i=1;i<(1<<n);++i){
ll xx=0;
for(int j=0;j<n;++j)
if(i&(1<<j)) xx^=l+j;
if(xx<ansxor && cnt(i)<=k){
ansxor=xx;
val.clear();
for(int j=0;j<n;++j) if(i&(1<<j)) val.push_back(l+j);
}
}
printf("%I64d\n",ansxor);
printf("%d\n",val.size());
for(int i=0;i<val.size();++i) printf("%I64d%c",val[i],i==val.size()-1?'\n':' ');
}
else if(r-l+1>=5){
if(k==1){printf("%I64d\n1\n%I64d\n",l,l);continue;}
if(k==2){
if(l&1) l++;
puts("1");
puts("2");
printf("%I64d %I64d\n",l,l+1);
}
else if(k>=4){
if(l&1) l++;
puts("0");
puts("4");
printf("%I64d %I64d %I64d %I64d\n",l,l+1,l+2,l+3);
}
else if(k==3){
ll x=-1,y,z;
for(ll i=3;i<=r;i=i<<1){
if((i^(i-1))>=l){
x=i;
y=i - 1;
z=i^(i-1);
break;
}
}
if(x!=-1){
puts("0");
puts("3");
printf("%I64d %I64d %I64d\n",x,y,z);
}
else {
if(l&1) l++;
puts("1");
puts("2");
printf("%I64d %I64d\n",l,l+1);
}
}
}
}
return 0;
}
codeforces 460D Little Victor and Set(构造、枚举)的更多相关文章
- Codeforces 460D Little Victor and Set --分类讨论+构造
题意:从区间[L,R]中选取不多于k个数,使这些数异或和尽量小,输出最小异或和以及选取的那些数. 解法:分类讨论. 设选取k个数. 1. k=4的时候如果区间长度>=4且L是偶数,那么可以构造四 ...
- Codeforces 460D Little Victor and Set(看题解)
Little Victor and Set 其他都很好求, 只有k == 3的时候很难受.. 我们找到第一个不大于l的 t, 答案为 l, 3 * t, (3 * t) ^ l 感觉好像是对的, 感觉 ...
- Codeforces 460D. Little Victor and Set
D. Little Victor and Set time limit per test:1 second memory limit per test:256 megabytes input:stan ...
- codeforces 460D:Little Victor and Set
Description Little Victor adores the sets theory. Let us remind you that a set is a group of numbers ...
- Codeforces 1276C/1277F/1259F Beautiful Rectangle (构造)
题目链接 http://codeforces.com/contest/1276/problem/C 题解 嗯,比赛结束前3min想到做法然后rush不出来了--比赛结束后又写了15min才过-- 以下 ...
- Codeforces 512E - Fox And Polygon(构造)
Codeforces 题面传送门 & 洛谷题面传送门 中规中矩的构造题一道. 首先考虑将两张图都向一个中间状态转化.方便起见我们取所有点都连向 \(1\) 号点的情形作为中间状态. 考虑怎样从 ...
- Codeforces Gym 100187K K. Perpetuum Mobile 构造
K. Perpetuum Mobile Time Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/pro ...
- Codeforces Gym 100425H H - Football Bets 构造
H - Football BetsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/ ...
- 【hihocoder1255 Mysterious Antiques in Sackler Museum】构造 枚举
2015北京区域赛现场赛第2题. 题面:http://media.hihocoder.com/contests/icpcbeijing2015/problems.pdf OJ链接:http://hih ...
随机推荐
- 在linux下运行apt-get update 时,报错/var/lib/apt/lists/lock
在运行apt-get update 时,报下面的错误: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: Resource temporarily unavai ...
- 【CISP笔记】安全漏洞与恶意代码(2)
恶意代码自我保护 进程保护 进程守护 超级权限 检测对抗 反动态调试 反静态调试 恶意代码检测技术 特征码扫描 沙箱技术 行为检测 恶意代码分析技术 静态分析 需要实际执行恶意代码,它通过对其二进制文 ...
- 总结——R中查看属性的函数
本文原创,转载注明出处,本人Q1273314690 R中知道一个变量的主要内容和结构,对我们编写代码是很重要的,也可以帮我们避免很多错误. 但是,R中有好几个关于属性查看的函数,我们往往不知道什么时候 ...
- 新手使用R的注意事项
1.最好先设置工作目录 如: setwd(“D:/DataDig”) 注意不是”\”,是”/” 再读取数据,如: datafile = read.csv("./test.csv") ...
- WCF :IIS寄宿方式的Web地址、BaseAddress和EndPoint Address的关系
对于在IIS中通过W3SVC或WAS寄宿的WCF Service,其在浏览器中显示的地址(Web地址),与其配置文件中的BaseAddress和EndPoint Address有什么关系呢?让我们来分 ...
- javascript高级程序设计---CSS操作
CSS与JavaScript是两个有着明确分工的领域,前者负责页面的视觉效果,后者负责与用户的行为互动.但是,它们毕竟同属网页开发的前端,因此不可避免有着交叉和互相配合. HTML元素的style属性 ...
- hdu5412——CRB and Queries
1.题目大意:区间第k大,单点修改 2.随便搞搞就好了= =,树套树或主席树,我写的很丑 #include <cstdio> #include <cstdlib> #inclu ...
- ubuntu安装android开发环境
1.安装oracle-jdk 打开终端,使用下面的命令: java -version 如果你看到像下面的输出,这就意味着你并没有安装过Java: The program ‘java’ can be f ...
- 解决ubuntu每次重启屏幕亮度都重置为最高亮度问题
很多朋友都会碰到这个问题,Ubuntu系统,每次通过系统设置修改了屏幕亮度,重启系统都会将屏幕亮度调成最大值,很是苦恼. 上网搜索一番发现,修改屏幕亮度的文件是:/sys/class/backligh ...
- linux kernel input 子系统分析
Linux 内核为了处理各种不同类型的的输入设备 , 比如说鼠标 , 键盘 , 操纵杆 , 触摸屏 , 设计并实现了一个对上层应用统一的试图的抽象层 , 即是Linux 输入子系统 . 输入子系统的层 ...