Codeforces 988D Points and Powers of Two ( 思维 || 二的幂特点 )
题意 : 给出坐标轴上的 n 个点的横坐标,要你选出最多的点,使得这些点两两距离是二的幂 ( 特殊情况 : 选出的集合只有一个点也满足条件 )
分析 :
官方题解已经说的很好了

最关键是是判断选出的集合元素数量肯定不可能大于 3
简单翻译一下题解就是
假设现有答案集合元素数量为 4 ,且令其为 a、b、c、d ( a < b < c < d )
令 a、b 间距为 dist(a, b) = 2^k
令 b、c 间距为 dist(b, c) = 2^l
则可得出 dist(a, c) = dist(a, b) + dist(b, c) = 2^k + 2^l = 2^m
根据二的幂相加的性质,可以得出 k == l ( !!!!! 这个思想很重要 !!!!!! )
对于 a、b、c 有如上关系,所以对于 b、c、d 也有同样的关系
所以有 dist(a, b) = dist(b, c) = dist(c, d) = 2^k
故有 dist(a, d) = 3 * 2^k 这个因为有因子 3 的存在,所以定不是二的幂
故推出答案集元素数量为 4 是不可行的,由此可以推广出 大于 4 的也都不可行
所以只要枚举二的幂,然后对于每一个点去检查其加上或者减去当前枚举的二的幂的元素是否存在
若都存在,那么肯定存在答案集合大小为 3 的解。若只存在一个,则存在答案集合大小为 2 的解。
若枚举完了都没有的话,那么答案集合大小只能为 1 ,此时随便输出一个元素即可。
#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define scs(i) scanf("%s", i)
#define sci(i) scanf("%d", &i)
#define scd(i) scanf("%lf", &i)
#define scl(i) scanf("%lld", &i)
#define scIl(i) scanf("%I64d", &i)
#define scii(i, j) scanf("%d %d", &i, &j)
#define scdd(i, j) scanf("%lf %lf", &i, &j)
#define scll(i, j) scanf("%lld %lld", &i, &j)
#define scIll(i, j) scanf("%I64d %I64d", &i, &j)
#define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)
#define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)
#define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)
#define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(i) (i & (-i))
#define mem(i, j) memset(i, j, sizeof(i))
#define fir first
#define sec second
#define ins(i) insert(i)
#define pb(i) push_back(i)
#define pii pair<int, int>
#define mk(i, j) make_pair(i, j)
#define all(i) i.begin(), i.end()
#define pll pair<long long, long long>
#define _TIME 0
#define _INPUT 0
#define _OUTPUT 0
clock_t START, END;
void __stTIME();
void __enTIME();
void __IOPUT();
using namespace std;
;
LL arr[maxn];
int main(void){__stTIME();__IOPUT();
set<LL> s;
int n;
sci(n);
; i<=n; i++){
scIl(arr[i]);
s.ins(arr[i]);
}
LL ans1, ans2, ans3;
bool _3 = false;
bool _2 = false;
; i<=; i++){
; j<=n; j++){
if(s.count(arr[j]+(1LL<<i))){
if(!_2){
_2 = true;
ans1 = arr[j];
ans2 = arr[j]+(1LL<<i);
}
if(s.count(arr[j]-(1LL<<i))){
if(!_3){
_3 = true;
ans1 = arr[j]-(1LL<<i);
ans2 = arr[j];
ans3 = arr[j]+(1LL<<i);
}
}
}
if(_3) break;
}
if(_3) break;
}
if(_3){
puts(");
return !printf("%I64d %I64d %I64d\n", ans1, ans2, ans3);
}
if(_2){
puts(");
return !printf("%I64d %I64d\n", ans1, ans2);
}
printf(]);
__enTIME();;}
void __stTIME()
{
#if _TIME
START = clock();
#endif
}
void __enTIME()
{
#if _TIME
END = clock();
cerr<<"execute time = "<<(double)(END-START)/CLOCKS_PER_SEC<<endl;
#endif
}
void __IOPUT()
{
#if _INPUT
freopen("in.txt", "r", stdin);
#endif
#if _OUTPUT
freopen("out.txt", "w", stdout);
#endif
}
Codeforces 988D Points and Powers of Two ( 思维 || 二的幂特点 )的更多相关文章
- Codeforces Round #486 (Div. 3)988D. Points and Powers of Two
传送门:http://codeforces.com/contest/988/problem/D 题意: 在一堆数字中,找出尽量多的数字,使得这些数字的差都是2的指数次. 思路: 可以知道最多有三个,差 ...
- CodeForces 577E Points on Plane(莫队思维题)
题目描述 On a plane are nn points ( x_{i}xi , y_{i}yi ) with integer coordinates between 00 and 10^{6} ...
- Codeforces Round #486 (Div. 3) D. Points and Powers of Two
Codeforces Round #486 (Div. 3) D. Points and Powers of Two 题目连接: http://codeforces.com/group/T0ITBvo ...
- Codeforces Round #546 (Div. 2) D 贪心 + 思维
https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...
- CF988D Points and Powers of Two 数学结论题 规律 第十题
Points and Powers of Two time limit per test 4 seconds memory limit per test 256 megabytes input sta ...
- 【Codeforces 988D】Points and Powers of Two
[链接] 我是链接,点我呀:) [题意] 让你从一个集合中找出来一个子集 使得这个子集中任意两个数相减的绝对值是2^的整数次幂 且集合的大小最大 [题解] 考虑子集的个数为4个或4个以上 那么我们找到 ...
- CodeForces - 988D(思维STL)
原文地址:https://blog.csdn.net/weixin_39453270/article/details/80548442 博主已经讲的很好了 题意: 从一个序列中,选出一个集合,使得集合 ...
- codeforces 349B Color the Fence 贪心,思维
1.codeforces 349B Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1 ...
- CodeForces 404C Ivan and Powers of Two
Ivan and Powers of Two Time Limit:1000MS Memory Limit:262144KB 64bit IO Format:%I64d & % ...
随机推荐
- Windows 下 C/C++ 多线程编程入门参考范例
#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI myThread(LPVO ...
- [转帖]关于Ubuntu与Debian的关系,了解!
关于Ubuntu与Debian的关系,了解! https://blog.csdn.net/guyue35/article/details/47286193 了解一下区别.. 饮水思源:Ubuntu ...
- mysql修改max_allowed_packet数据包最大值
在windows环境下!!!! 1.找到my.inc文件,不是你的安装目录路径,是C:\ProgramData\MySQL\MySQL Server 5.7这个路径,注意 ProgramData 文件 ...
- Spring boot 整合 shiro 出现 org.apache.shiro.UnavailableSecurityManagerException: 错误
最开始参考的是这个 文档 但是并没有解决我的问题,因为他的配置和我的是一样(差不多)的 https://www.cnblogs.com/ginponson/p/6217057.html 然后看到此篇博 ...
- you_are_the_one(区间dp)
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- PostgreSQL-临时表空间与配置表
虽然我给数据库创建了表空间,但是操作中仍遇到了些问题,需要创建临时表空间. 配置表 首先了解下 postgres 的配置表,手动修改各种配置. 打开即可看到各种配置,包括临时表空间. 临时表空间 1. ...
- Codeforces 1215D. Ticket Game
传送门 博弈,发现情况有点多,分析一下把有用的状态提取出来 显然各个位置的数字是没用的,我们只要知道两边的数字和分别是多少 并且状态显然和左右两边的 "?" 数量有关 因为最终我们 ...
- .Net Core 认证系统源码解析
不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境怎么变,坚持自己的当初的选择,坚持信仰 .Net Cor ...
- SQLite3中自增主键相关知识总结,清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
这篇文章主要介绍了SQLite3中自增主键相关知识总结,清零的方法.INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以参考下 一.SQLite清空表 ...
- SpringBoot页面展示Thymeleaf
https://www.jianshu.com/p/a842e5b5012e 开发传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了.Spring ...