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 & % ...
 
随机推荐
- 【神经网络与深度学习】【python开发】caffe-windows使能python接口使用draw_net.py绘制网络结构图过程
			
[神经网络与深度学习][python开发]caffe-windows使能python接口使用draw_net.py绘制网络结构图过程 标签:[神经网络与深度学习] [python开发] 主要是想用py ...
 - Anko
			
先mark一下. https://www.jianshu.com/p/4a3ca2c315f2
 - HDU 1003 Max Sum (动态规划 最大区间和)
			
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
 - Selenium+PhantomJs 爬取网页内容
			
利用Selenium和PhantomJs 可以模拟用户操作,爬取大多数的网站.下面以新浪财经为例,我们抓取新浪财经的新闻版块内容. 1.依赖的jar包.我的项目是普通的SSM单间的WEB工程.最后一个 ...
 - pair常见用法
			
pair的使用 关于pair 什么是pair 可以将pair看做一个内部有两个元素的结构体,且两个元素的类型是可以指定的. struct pair{ typename1 first; typename ...
 - HTTPS为什么是安全的?
			
学习自https://www.cnblogs.com/zhangsanfeng/p/9125732.html,感谢博主 超文本传输协议HTTP被用于在web浏览器和网站服务器之间传递信息,但以明文方式 ...
 - 微信小程序实现滑动删除效果
			
在一些app中,随处可见左滑动的效果,在微信小程序中,官方并未提供相关组件,需要我们自己动手写一个类似的效果 下面仅列举出核心代码,具体的优化需要根据你自身的需求 <view class='li ...
 - 字符串连连看 (和hihocoder 字符消除类似)
			
题目描述 对于输入的字符串,从左到右扫描字符串,如果存在由三个以上(包括三个)连续相同字符组成的子串,就将这个子串从原串中去掉,并将原有字符串剩下的部分拼接到一起.重复上述过程,直到无法去掉任何子串 ...
 - 使用Servlet实现验证码
			
没有验证码带来的问题 对特定用户不断登录破解密码. 对某个网站创建账户. 对某个网站提交垃圾数据. 对某个网站刷票. 通过验证码由用户肉眼识别其中的验证码信息,从而区分用户是人还是计算机. 定义: ...
 - mpvue开发微信小程序之picker
			
微信使用picker组件,bingchange 换成@change即可使用监听函数和方法 此处注意与微信多了一个mp的信息才能获取到选中的值. 获取当前日期+时间 function formatTim ...