首页 > 其他分享 >CF988D Points and Powers of Two 题解

CF988D Points and Powers of Two 题解

时间:2024-06-20 15:32:54浏览次数:14  
标签:le cout int 题解 整数 Points 序列 Powers 2i

题目传送门


题目大意

题目描述

在坐标线上有 n n n 个不同的点,第 i i i 个点的坐标为 x i x_i xi​。选择给定点集的一个子集,使得子集中每对点之间的距离是 2 d 2^d 2d 的整数幂。需要考虑每对点,而不仅仅是相邻的点。注意,包含一个元素的任何子集都满足上述条件。在所有这些子集中,选择具有最大可能大小的子集。

换句话说,你需要选择尽可能多的点 x i 1 , x i 2 , … , x i m x_{i_1}, x_{i_2}, \dots, x_{i_m} xi1​​,xi2​​,…,xim​​,使得对于每一对 x i j x_{i_j} xij​​, x i k x_{i_k} xik​​,满足 ∣ x i j − x i k ∣ = 2 d |x_{i_j} - x_{i_k}| = 2^d ∣xij​​−xik​​∣=2d,其中 d d d 是某个非负整数(不必对每对点都相同)。

输入格式

第一行包含一个整数 n n n( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \le n \le 2 \cdot 10^5 1≤n≤2⋅105)— 点的数量。

第二行包含 n n n 个两两不同的整数 x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1​,x2​,…,xn​( − 1 0 9 ≤ x i ≤ 1 0 9 -10^9 \le x_i \le 10^9 −109≤xi​≤109)— 点的坐标。

输出格式

第一行输出一个整数 m m m — 满足上述条件的子集中点的最大可能数量。

第二行输出 m m m 个整数 — 选定子集中的点的坐标。

如果存在多个答案,输出其中任意一个即可。


解题思路

简化题意得:给你有 n n n 个数字的一个数列,问最多有多少个数字他们两两的差是 2 2 2 的幂次方数。

首先我们可以得出我们选择的数不超过 3 3 3 个。

为什么呢?我们都知道如果 2 i + 2 j = a k 2^i+2^j=a^k 2i+2j=ak,那么 i = j , k = 2 × i = 2 × j i=j,k=2\times i=2\times j i=j,k=2×i=2×j,我们设取出的 3 3 3 个数为 a , b , c a,b,c a,b,c,首先它们一定满足 ∣ a − b ∣ = 2 i , ∣ b − c ∣ = 2 j , ∣ a − c ∣ = 2 k |a-b|=2^i,|b-c|=2^j,|a-c|=2^k ∣a−b∣=2i,∣b−c∣=2j,∣a−c∣=2k。

∵ ∣ a − c ∣ = ∣ a − b ∣ + ∣ b − c ∣ \because |a-c|=|a-b|+|b-c| ∵∣a−c∣=∣a−b∣+∣b−c∣。

∴ k = i + j \therefore k = i + j ∴k=i+j。

因此我们可以构造这个序列,比如 a = 1 , b = 3 , c = 5 a=1,b=3,c=5 a=1,b=3,c=5。

如果我们再取一个数 d d d,那么 ∣ a − b ∣ = 2 i , ∣ b − c ∣ = 2 j , ∣ c − d ∣ = 2 p , ∣ a − d ∣ = 2 q |a-b|=2^i,|b-c|=2^j,|c-d|=2^p,|a-d|=2^q ∣a−b∣=2i,∣b−c∣=2j,∣c−d∣=2p,∣a−d∣=2q。

∵ ∣ a − d ∣ = ∣ a − b ∣ + ∣ b − c ∣ + ∣ c − d ∣ \because |a-d|=|a-b|+|b-c|+|c-d| ∵∣a−d∣=∣a−b∣+∣b−c∣+∣c−d∣。

∴ q = i + j + p \therefore q=i+j+p ∴q=i+j+p

然而 3 × 2 i ≠ 2 q 3\times 2^i \ne 2^q 3×2i=2q,这个序列既然连一部分的条件都满足不了,那么所有条件一定也不能全部满足,所以当我们取的数字数量为 4 4 4 的时候无解。

如果我们取 x ( x > 4 ) x(x>4) x(x>4) 个数字,那么包含了取 4 4 4 个数字的情况,显然无解。

所以我们取的序列长度必须小于等于 3 3 3,且经递增排序后,相邻两数之差相等。因此,我们可以先枚举整个序列中起始位置的数 y y y,再依次判断 y + 2 k , y + 2 k + 1 y+2^k,y+2^{k+1} y+2k,y+2k+1 是否在序列中出现过并进行统计即可。


CODE:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[200010];
int n;
map<int, bool> m;
int k[200010];
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n;
	for (register int i = 1; i <= n; i++) {
		cin >> a[i];
		m[a[i]] = 1;
	}
	int ans = 0;
  //蒟蒻赛时没有想那么多,这里枚举的是序列长度大于 1 且小于等于 3 的解
	for (register int i = 1; i <= n; i++) {
		for (register int j = 0; j <= 30; j++) {
			int o = 1;
			o <<= j;
			if (m.count(a[i] + o)) {  //也可以排序后二分哦
				int temp = a[i] + o;
				if (ans <= 2)
					k[1] = a[i], k[2] = temp, ans = 2;
				if (m.count(temp + o)) {
					cout << 3 << endl;
					cout << k[1] << ' ' << k[2] << ' ' << k[2] + o;
					return 0;
				}
			}
		}
	}
	if (ans == 0) {    //如果找不到长度大于 1 且小于等于 3 的序列随便输出序列中的一个数即可。
		cout << 1 << endl;
		cout << a[1] << endl;
		return 0;
	}
	cout << ans << endl;
	for (int i = 1; i <= ans; i++)
		cout << k[i] << ' ';
	return 0;
}


总结

这道题目主要是序列长度小于等于 3 3 3 的地方需要一定的时间去证明,总体来说思路比较容易想到。

标签:le,cout,int,题解,整数,Points,序列,Powers,2i
From: https://blog.csdn.net/2301_76224755/article/details/139743791

相关文章

  • CF212D 题解
    根据此题首次学到二阶差分Trick,好题。题意给出一个序列\(\{a_n\}\),满足\(n\le10^6,1\lea_i\le10^9\),定义函数\(f(i,k)\)为:\[f(i,k)=\min\limits_{j=i}^{i+k-1}a_j\]你需要回答\(m\)个询问,每次询问给出一个整数\(k\)(\(1\lek\len\)),求所有\(f(i,k......
  • DataTrigger 数据触发器触发动画的方式及问题解决
    在WPF中通过触发器实现动画的方式很常见,这里记录一下再使用DataTrigger数据触发器触发动画的一些经验,以便备忘。一、数据触发器DataTrigger与普通的触发器Trigger区别:Trigger普通触发器<!--样式--><StyleTargetType="TextBlock"><Style.Triggers><!--这里......
  • 2024年BCSP-X初赛真题解析(小高组)
    学习C++从娃娃抓起!学习下帝都的对标CSP的BCSP考试,记录下CSP-J备考学习的每一个瞬间。单选题第1题计算机在工作过程中突然停电,()中的信息不会丢失。A.显存B.寄存器C.RAMD.ROM【答案】:D第2题中缀表达式a*(b+c)-d的后缀形式是()。A.abcd*±B.abc+*d-C.abc*+d-D.-+......
  • P6261 [ICPC2019 WF] Traffic Blights 题解
    思路考虑题目要求的是什么。假设\(p_i\)代表通过前\(i\)个红绿灯的概率。那么我们的答案即为\(p_i-p_{i-1}\)。不妨设\(w_i=r_i+g_i\)。我们的限制条件类似:\[t\not\equiva_i\pmodw_i\]那么所有红绿灯会形成周期\(lcm(w_1,w_2,\cdots,w_n)\)。由于\(2019!\)肯......
  • P10540 [THUPC2024] 古明地枣的袜子 题解
    题意:一个长为\(n\)的序列\(a\),初始全为零。\(n\)个操作,第\(i\)个操作形如给\(a_1,\cdots,a_{x_i}\)加上\(y_i\)。\(m\)次查询,给定\(l,r\),求对\(a\)执行第\(l\simr\)个操作后数列\(a\)的全局最大值。\(1\len,m\le5\cdot10^5,1\lex_i,|y_i|\len,1\lel\ler\len\),时间限......
  • GDCPC 2024 部分题解
    老年人过来对着会的题口胡几发B.腊肠披萨 题意翻译:给你n个小写字母串,求所有小写字母串两两之间的最长公共前缀的乘方和,对一个任意数取模。比较显然的,看到多串公共前缀直接建Trie统计贡献。建好之后对每个串在Trie上走,每走一步加上当前子树内串个数和父子树内串个数之差,就能......
  • LeetCode80. 删除有序数组中的重复项 II题解
    LeetCode80.删除有序数组中的重复项II题解题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/题目描述:给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数......
  • LeetCode26. 删除有序数组中的重复项题解
    LeetCode26.删除有序数组中的重复项题解题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array题目描述:给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一......
  • python系列&AI系列:cannot import name ‘ForkProcess‘ from ‘multiprocessing.conte
    cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问题解决cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问题解决问题描述问题原因解决方案cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问......
  • CF1537F 题解
    一道结论型的图论题。约定:偶环:节点个数为偶数的环使得任意不相同两点之间有且仅有2条简单路径的环。奇环:节点个数为奇数的环使得任意不相同两点之间有且仅有2条简单路径的环。令点\(i\)的权值为\(a_i\),有\(a_i=t_i-v_i\),其中\(v_i,t_i\)为题目给出的。称一个图为好......