CF1847E Triangle Platinum? 题解

感谢 @swiftc 管理反馈的信息,对于题目大意确定的东西进行了完善。

交互题。

题目大意

有一个长度为 \(n\) 的序列 \(a\) 满足 \(1 \leq a_i \leq 4\),现在你可以进行不超过 \(5500\) 次询问,每次询问询问三个数 \(1 \leq i < j <k \leq n\),你将会得到 \(a_i,a_j,a_k\) 构成的三角形面积的平方乘 \(16\) 的结果,特别的,如果构不成三角形你将会得到 \(0\)

你最后需要确定具体的序列 \(a\),如果确定不了请输出 \(-1\)

数据范围为 \(n \leq 5000, 1\leq a_i\leq 4\)

思路

考虑 \(5500-5000=500\),我们可以利用这 \(500\) 从次操作干什么呢。

我们如果对于一个长度为 \(k\) 的序列暴力,那么我们需要消耗 \(\binom{k}{3}\) 次操作,时间复杂度为 \(O(2^{2k}k^3)\)

我们选定 \(k=9\),那么根据鸽巢原理,这 \(9\) 个数中,必然有一个数出现次数 $ \geq 3$。

直接暴力找出这个数,记为 \(s\),这三个数下标为 \(x,y,z\),然后开始分类讨论。

  1. \(s=1\),那么我们顺序扫过去,当前为 \(now\),如果询问 ? x y now 结果不是 \(0\),那么我们可以确定 \(a_{now}=1\),否则确定 \(a_{now} \neq 1\)。接下来我们拿出 \(a_{now } \neq 1\)\(k\) 个数来暴力,这样就可以归类到第二种情况。
  2. \(s \neq 1\),考虑这个时候询问 ? x y now 的结果对于不同的 \(a_{now}\) 来说必定不同,所以我们直接扫一遍就可以了。

时间复杂度 \(O(2^{2k}k^3)\)

代码,写的可能有点丑。

posted @ 2024-02-08 19:57  OccDreamer  阅读(23)  评论(0)    收藏  举报