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 ,此时随便输出一个元素即可。
![](/assets/blank.gif)
![](/assets/blank.gif)
#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; const int maxn = 2e5 + 10; LL arr[maxn];int main(void){__stTIME();__IOPUT();set<LL> s;int n;sci(n);for(int i=1; i<=n; i++){scIl(arr[i]);s.ins(arr[i]);}LL ans1, ans2, ans3;bool _3 = false;bool _2 = false;for(int i=0; i<=30; i++){for(int j=1; 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("3");return !printf("%I64d %I64d %I64d\n", ans1, ans2, ans3);}if(_2){puts("2");return !printf("%I64d %I64d\n", ans1, ans2);}printf("1\n%I64d\n", arr[1]);__enTIME();return 0;}void __stTIME() {#if _TIMESTART = clock();#endif }void __enTIME() {#if _TIMEEND = clock();cerr<<"execute time = "<<(double)(END-START)/CLOCKS_PER_SEC<<endl;#endif }void __IOPUT() {#if _INPUTfreopen("in.txt", "r", stdin);#endif#if _OUTPUTfreopen("out.txt", "w", stdout);#endif }
View Code
转载于:https://www.cnblogs.com/LiHior/p/9129063.html
Codeforces 988D Points and Powers of Two ( 思维 || 二的幂特点 )相关推荐
- Codeforces Round #619 (Div. 2) E. Nanosoft 思维 + 二维前缀和
传送门 文章目录 题意: 思路: 题意: 思路: 考虑到最大面积是由四种颜色构成的,且四种颜色可以从中心扩展出去,所以我们分别维护四种颜色的二维前缀和,O(1)O(1)O(1)计算矩阵内颜色的个数.现 ...
- CodeForces - 76E Points
CodeForces - 76E Points 题意: 给你n个点的坐标,求所有一对点之间的距离的平方和 n<=100000 题解: 直接暴力n2肯定不行,我们把这个的式子列出来: 代码: #i ...
- STL — 迭代器设计思维(二)
迭代器设计思维(二) 上一篇博客主要介绍了STL迭代器中的5种类型的迭代器,以及迭代器当中的5种相应型别,最后提到了traits编程技法. 这些都是尤为重要的,我们阅 读源码最重要的就是理解加应用. ...
- CodeForces - 1095C Powers Of Two(思维)
题目链接:点击查看 题目大意:给出n和k,问能否将n分解成k个二的幂次之和,可以重复 题目分析:首先我们需要知道二的幂次是1,2,4,8等等之类二的n次方这样的类型,我们很容易知道不能分解的情况,一种 ...
- D. Points and Powers of Two
https://codeforces.com/problemset/problem/988/D 题目描述 There are nn distinct points on a coordinate li ...
- codeforces 808 E. Selling Souvenirs (dp+二分+思维)
题目链接:http://codeforces.com/contest/808/problem/E 题意:最多有100000个物品最大能放下300000的背包,每个物品都有权值和重量,为能够带的最大权值 ...
- Codeforces Round #587 C. White Sheet(思维+计算几何)
传送门 •题意 先给一个白矩阵,再两个黑矩阵 如果两个黑矩阵能把白矩阵包含,则输出NO 否则输出YES •思路 计算几何题还是思维题呢? 想起了上初中高中做几何求面积的题 这个就类似于那样 包含的话分 ...
- CodeForces - 1559D2 Mocha and Diana (Hard Version)(思维)
题目链接:点击查看 题目大意:给出两棵森林,每次可以同时在两个森林中增加同一条边,问最多可以增加多少条边,使得两个森林仍然还是森林 题目分析:结论参考至:https://blog.csdn.net/R ...
- CodeForces - 468B Two Sets(并查集+思维)
题目链接:点击查看 题目大意:现在给出两个集合A和B,再给出两个数a和b,现在规定在集合A中的数x必须满足x和a-x同时在集合a中,而在集合B中的数x也同样需要满足x和b-x同时在集合B中,现在给出一 ...
- CF--思维练习--CodeForces - 221C-H - Little Elephant and Problem (思维)
ACM思维题训练集合 The Little Elephant has got a problem - somebody has been touching his sorted by non-decr ...
最新文章
- Ubuntu安装以太坊客户端
- 如何让两个输入框保持长度一直_投篮如何保持直线,为什么有些职业球员手臂弯曲投篮一直直...
- python划分数据集_Python数据集切分实例
- 最美的Linux中文版的吗,号称最美的Linux发行版——Elementary OS
- Linux USB 驱动开发实例 (三)—— 基于USB总线的无线网卡浅析
- pytorch 对抗样本_【炼丹技巧】功守道:NLP中的对抗训练 + PyTorch实现
- (2)zynq FPGA AXI_Lite总线介绍
- hibernate关联映射
- TensorFlow2实现空间自适应归一化(Spatial Adaptive Normalization, SPADE)
- 橡胶支座抗压弹性模量计算公式_单向滑动抗震弹性支座作用介绍
- iPhone X 不充电维修案例
- 思科asa5515端口映射_思科防火墙端口映射配置方法
- [DataAnalysis]基于统计假设检验的机器学习模型性能评估——泛化误差率的统计检验
- 汇率兑换 python第一课_【Python 07】汇率兑换1.0-2(基本元素)
- 数据库相关基础知识总结
- 为什么射极输出器的输入电阻跟负载R(L)有关?
- 新东方:俞敏洪从台前走入幕后
- 【软件工具】软件测试
- Android UI系列之侧滑粘稠效果的实现
- 软件产品化, 国内IT人之痛