数组成鸡
数组成鸡
题目描述
小鸡有一个由整数组成的数组,小鸡可以对这个数组进行任意次(可以不进行)全数组每个数加一或全数组每个数减一的操作。
现在,小鸡想让你回答 次询问,每次询问给出一个整数 ,你需要回答任意次(可以不操作)操作后是否可以使得给定数组的乘积等于给出的整数 。
输入描述:
第一行输入两个正整数 , (, ),表示数组长度与询问次数。
第二行输入 个空格分隔的整数 (),表示数组中的元素。
接下来 个空格分隔的整数 (),表示询问的数字。
输出描述:
对于每个 ,请你输出一行 "Yes" 或 "No"(不含引号)表示是否可以令全数组的乘积等于给定 。
示例1
输入
4 9
1 -1 3 5
-75 19305 123 1 0 15 -15 1919810 114514
输出
No
Yes
No
No
Yes
No
Yes
No
No
解题思路
由于询问的 最大为 ,所以如果操作后 中绝对值大于 的元素数量至少为 时,。为此如果 ,我们只能将某些数变成 或 ,然后再判断所有数乘积的绝对值是否不超过 ,如果不超过则把乘积结果存到 std::set
中。如果 ,则需要保证操作后最小的两个元素的绝对值不能同时大于 ,因此只需暴力枚举操作次数 ,如果所有数乘积的绝对值不超过 则存到 std::set
中。最后询问只需判断 是否在集合中即可。下面给出具体做法。
如果 ,用 来表示初始 中元素 数量,枚举每一种数 (即重复的只枚举 次),先通过加 次 把 变成 (元素 会变成 )。如果 ,则检查操作后 的乘积的绝对值是否不超过 。同理把 变成 。其中检查的部分是暴力枚举,时间复杂度为 ,但实际上检查的次数非常少(最多应该只有一次),因为如果要满足 ,意味着 ,此时整个 中基本都是元素 或 。
如果 ,对 排序,分别枚举 和 的情况,即分别加 次 和加 次 ,。计算量大概是 级别。
AC 代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
int n, m;
int a[N];
set<int> st({0});
void get(int x) {
LL t = 1;
for (int i = 0; i < n; i++) {
t *= (a[i] + x);
if (abs(t) > LL(1e9)) return;
}
st.insert(t);
}
int main() {
scanf("%d %d", &n, &m);
map<int, int> mp;
for (int i = 0; i < n; i++) {
scanf("%d", a + i);
mp[a[i]]++;
}
sort(a, a + n);
if (n >= 30) {
for (int i = 0; i < n; i++) {
if (!i || a[i] != a[i - 1]) {
if (n - mp[a[i]] - mp[a[i] - 2] < 30) get(-a[i] + 1);
if (n - mp[a[i]] - mp[a[i] + 2] < 30) get(-a[i] - 1);
}
}
}
else {
for (int i = -31622; i <= 31622; i++) {
get(-a[0] + i);
get(-a[1] + i);
}
}
while (m--) {
int x;
scanf("%d", &x);
printf("%s\n", st.count(x) ? "Yes" : "No");
}
return 0;
}
参考资料
【出题人讲题】2024牛客寒假算法基础集训营1 题解:https://www.bilibili.com/video/BV1Ry421a7pW/
2024牛客寒假算法基础集训营1(全部题目详解):https://www.bilibili.com/video/BV1Ty421a7vN/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/18016563
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2023-02-15 Nim游戏