感谢 @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\),然后开始分类讨论。
- \(s=1\),那么我们顺序扫过去,当前为 \(now\),如果询问
? x y now
结果不是 \(0\),那么我们可以确定 \(a_{now}=1\),否则确定 \(a_{now} \neq 1\)。接下来我们拿出 \(a_{now } \neq 1\) 的 \(k\) 个数来暴力,这样就可以归类到第二种情况。 - \(s \neq 1\),考虑这个时候询问
? x y now
的结果对于不同的 \(a_{now}\) 来说必定不同,所以我们直接扫一遍就可以了。
时间复杂度 \(O(2^{2k}k^3)\)。
代码,写的可能有点丑。
标签:Platinum,Triangle,题解,询问,leq,确定,now,我们,neq From: https://www.cnblogs.com/OccasionalDreamer/p/18012081