2024/10/2 CSP-S daimayuan模拟赛复盘
2024/10/2 CSP-S daimayuan
A. 序列
题面描述
给你一个序列
,问有多少非负整数序列 满足:
对于所有
, 。 满足
,左边为二进制或。 输出答案对
取模的结果。
输入 & 输出 & 样例 & 数据范围
输入第一行一个整数
。 接下来一行,一共
个整数 。 输出一个整数,表示答案。
对于所有数据,保证
。
5
1 2 3 4 5
思路解析
首先考虑将那个按位或的条件转换一下,可以得到条件等价于要求对于所有的
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 18, M = 64;
const ll P = 998244353;
ll n, r[N], f[2][1 << N];
int g(ll x, int y) {
return (x >> y) & 1;
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++) cin >> r[i];
f[63 & 1][0] = 1;
for(int i = 62; i >= 0; i--) {
for(int j = 0; j < (1 << n); j++) f[i & 1][j] = 0;
for(int j = 0; j < (1 << n); j++) {
int tmp = 0;
for(int k = 1; k <= n; k++) {
if(g(j, k - 1) || g(r[k], i)) tmp += (1 << (k - 1));
}
f[i & 1][tmp] += f[(i + 1) & 1][j];
for(int k = 1; k <= n; k++) {
int top = ((g(j, k - 1) || g(r[k], i)) ? 1 : 0);
if(g(j, k - 1) || g(r[k], i)) {
int now = ((tmp ^ (1 << (k - 1))) | ((g(j, k - 1)) << (k - 1)));
f[i & 1][now] += f[(i + 1) & 1][j]; f[i & 1][now] %= P;
}
}
}
}
ll ans = 0;
for(int j = 0; j < (1 << n); j++) ans = (ans + f[0][j]) % P;
cout << ans;
return 0;
}
B. 合并数字
题面描述
有
个数字, 。每次可以选择两个数字 删除,然后加入数字 。 轮之后只剩下一个数字,问最后剩下的数字最大可能是多少? 你要对
个不同的 进行回答。每组询问独立,都是对于一开始的序列操作。
输入 & 输出 & 样例 & 数据范围
输入第一行两个整数
。 接下来一行
个整数 。 接下来一行
个整数 ,表示每次询问的值。 输出一共
行,每行一个整数,表示答案。 对于所有数据,保证
。
思路解析
通过找规律或打表可以发现最终的答案的式子肯定是形如
可以发现元素的符号和其深度的奇偶性直接相关,于是我们把
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5 + 10;
int n, Q, a[N], s[N];
bool cmp(int x, int y) {
return x > y;
}
int calc(int k, int x, int y) {
if(x < 0) return -2e9;
return 2ll * s[x] - s[n] + k * y;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> Q;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1, cmp);
for(int i = 1; i <= n; i++) s[i] = s[i - 1] + a[i];
int x = (2 * n - 1) % 3, y = (n + 1 - x) / 3;
// cout << " " << x << ' ' << y << ' ' << calc(3, x + 3 * 0, y - 2 * 0) << '\n';
while(Q--) {
int k; cin >> k;
int l = 0, r = (n - x) / 3;
// cout << " " << l << ' ' << r << '\n';
while(l <= r) {
int ml = l + (r - l + 1) / 3, mr = ml + (r - l + 1) / 3;
if(calc(k, x + 3 * ml, y - 2 * ml) > calc(k, x + 3 * mr, y - 2 * mr)) r = mr - 1;
else l = ml + 1;
// cout << " " << l << ' ' << r << '\n';
}
int ans = max(max(calc(k, x + 3 * l, y - 2 * l), calc(k, x + 3 * r, y - 2 * r)), max(calc(k, x + 3 * l + 3, y - 2 * l - 2), calc(k, x + 3 * r - 3, y - 2 * r + 2)));
cout << ans << '\n';
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人