179
A - Partition
给你整数
长度为
长度为
- 在
的累积和中,任何小于 的值都出现在任何不小于 的值之前。 - 形式上,对于
的累积和 ,对于任意一对整数 ,若 ,若 和 ,则 。
- 形式上,对于
给你一个长度为
本题的突破点在
当
当
#define int long long
void solve() {
int n, k;cin >> n >> k;
vector<int> a(n + 1), pre(n + 1);
for (int i = 1;i <= n;i++)cin >> a[i];
sort(a.begin() + 1, a.end());
if (k <= 0) {
reverse(a.begin() + 1, a.end());
for (int i = 1;i <= n;i++)pre[i] = pre[i - 1] + a[i];
for (int i = 1;i <= n;i++) {
if (pre[i] < k) {
cout << "No\n";return;
}
}
}
cout << "Yes\n";
for (int i = 1;i <= n;i++)cout << a[i] << " ";
}
B - Between B and B
给你一个长度为
请求模为
之间的整数组成的长度为
- 对于每个
,在 中 的任意两个不同出现点(包括两端)之间存在值 。(包括两端)。
更正式地说,对于每个
- 对于每一对整数
,即 和 ,都存在一个整数 ( ),即 。
Solution
本题的空间其实有点紧张的,可以像 jiangly 一样滚动数组优化。
#define int long long
constexpr int mod = 998244353;
int f[10010][1 << 11];
void solve() {
int m, n;cin >> m >> n;
vector<int> mask(m + 1);
for (int i = 1;i <= m;i++) {
int x;cin >> x;
mask[x] |= (1 << (i - 1));
}
f[0][(1 << m) - 1] = 1;
for (int i = 0;i < n;i++) {
for (int j = 1;j <= m;j++) {
for (int k = 0;k < 1 << m;k++) {
if ((k >> j - 1) & 1) {
f[i + 1][(k ^ (1 << j - 1)) | mask[j]] += f[i][k];
f[i + 1][(k ^ (1 << j - 1)) | mask[j]] %= mod;
}
}
}
}
int ans = 0;
for (int i = 0;i < 1 << m;i++) {
ans += f[n][i];ans %= mod;
}
cout << ans << '\n';
}
Q: 如何化简为无
然后是补昆明邀请赛和西安邀请赛,然后百度之星+ABC 板刷+CF 板刷
鉴于时间紧张 C 题先不补(挖坑...)