Codeforces Round 902 (Div. 2) (CF1877) B、C、D 题解
B
题目大意
你要传话给
分析
首先传给第一个人只少要
下来贪心,每次让花费最小、且能够传话的人去传话。
考虑建一个堆,堆内的信息是花费
- 取出堆顶,进行一次传话,其
减一 - 若
变为 ,则将其从堆中弹出
一共会进行
Code (注意开 C++ 20)
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false); cin.tie(0)
using namespace std;
using ll = long long;
int n, p;
void solve() {
map<ll, ll> cnt;
cin >> n >> p;
vector<ll> a(n + 1), b(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) {
cin >> b[i];
cnt[b[i]] += a[i];
}
cnt[p] += n;
ll ans = p;
for (int i = 1; i < n; i++) {
auto [x, y] = *cnt.begin();
ans += x;
if (y == 1)
cnt.erase(cnt.begin());
else
cnt[x]--;
}
cout << ans << endl;
}
int main() {
IO;
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
C
题目大意
要求你构造一个长度为
问最后数组中有
分析
注意到无论赋的这个值
假设
所以数组最多存在
下面分情况讨论:
-
,那么 , -
,有两种情况: ,即 ,总共有 种 ,那么构造出来的数组是 ,总共有 种
-
,答案是 种
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false); cin.tie(0)
using namespace std;
void solve() {
int n, m, k;
cin >> n >> m >> k;
if (k >= 4) {
cout << 0 << endl;
} else if (k == 3) {
if (m < n) cout << 0 << endl;
else cout << m - n - m / n + 1 << endl;
} else if (k == 2) {
if (m <= n) cout << m << endl;
else cout << n + m / n - 1 << endl;
} else {
cout << 1 << endl;
}
}
int main() {
IO;
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
D
题目大意
给出
每次染色后,答案是被染色的点的最大值
一共有
分析
考虑每一个点对整个答案的贡献:
首先这个点需要是所有选中点里最大的,才会产生贡献。
换句话说,只有比这个点大的点都都\已经被计算完毕,并且排除掉后,它才会产生贡献。
那么考虑将点的值排序,从大往小考虑:
如果当前点
-
假设这剩下的
个点中,是 的因数的点有 个,点集为 ,其中那么
这个点产生的贡献值为 -
随后我们将属于
因数的点集 从 中删掉,继续考虑剩下的点中最大的那个数
下来考虑如何知道属于点
我的方法是建立一张图,如果点
每次考虑点
Code
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false); cin.tie(0)
using namespace std;
using ll = long long;
using pll = pair<ll, ll>;
const ll mod = 998244353;
const int N = 1e5 + 5;
int n, cnt;
pll a[N];
ll ans;
vector<int> G[N];
ll qpow(ll x, ll y) {
ll res = 1;
while (y) {
if (y & 1) res = res * x % mod;
y >>= 1;
x = x * x % mod;
}
return res;
}
bool vis[N];
void init() {
for (int i = 1; i * i <= n; i++) {
for (int j = i * i; j <= n; j++) {
if (j % i == 0) {
G[j].push_back(i);
if (j != i * i && i != 1)
G[j].push_back(j / i);
}
}
}
}
void dfs(int now, ll val) {
cnt--;
ans += qpow(2, cnt) * val;
ans %= mod;
for (int son : G[now]) {
if (vis[son]) continue;
vis[son] = true;
dfs(son, val);
}
}
int main() {
IO;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].first;
a[i].second = i;
}
sort(a + 1, a + n + 1);
cnt = n;
init();
for (int i = n; i >= 1 && cnt > 0; i--) {
if (vis[a[i].second]) continue;
vis[a[i].second] = true;
dfs(a[i].second, a[i].first);
}
cout << ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现