AtCoder Beginner Contest 323 (ABC 323) D、E、F 题解
AtCoder Beginner Contest 323 (ABC 323) D、E、F 题解
D
题目大意
给
分析
对于每一个数
如果将
因此考虑维护一个堆,每次将最小的数尽量合并,如果该元素只剩一个就将其踢出去并让答案+1。
Code (用优先队列写很慢~)
#include<bits/stdc++.h>
#define IO ios::sync_with_stdio(false); cin.tie(0)
using namespace std;
using ll = long long;
const int N = 1e5 + 5;
int n;
ll s[N], c[N];
map<ll, ll> cnt;
int main() {
IO;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i] >> c[i];
cnt[s[i]] += c[i];
}
ll ans = 0;
while (!cnt.empty()) {
auto [x, y] = *cnt.begin();
cnt.erase(cnt.begin());
ans += y % 2;
if (y > 1) {
cnt[x*2] += y / 2;
}
}
cout << ans;
return 0;
}
E
题目大意
给
分析
应该说我的方法不如官方题解
如果第
考虑
那么最终的结果就是
可以得到比较暴力的转移式子:
在实现的时候,可以写成 f[i+t[j]][k] += f[i][j] / n
那么注意到,无论
那么用
注意分数逆元是可以直接加减的 !
对于两个分数
当它们相加时,
Code
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 998244353;
const int N = 1005, M = 3e4 + 5;
int n, x;
ll t[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;
}
ll f[M][N], sum[M];
ll frac(ll a, ll b) {
return (a * qpow(b, mod - 2) % mod + mod) % mod;
}
int main() {
cin >> n >> x;
for (int i = 1; i <= n; i++) cin >> t[i];
for (int i = 1; i <= n; i++)
f[0][i] = frac(1, n);
for (int i = 0; i <= x; i++) {
for (int j = 1; j <= n; j++) {
f[i][j] = (f[i][j] + sum[i]) % mod;
sum[i+t[j]] = (sum[i+t[j]] + frac(f[i][j], n)) % mod;
}
}
ll res = 0;
for (int i = max(0ll, x - t[1] + 1); i <= x; i++)
res = (res + f[i][1]) % mod;
cout << res;
return 0;
}
F
AtCoder 你确定没有把 D 和 F 放反吗???
题目大意
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll Abs(ll a) {
return a > 0 ? a : -a;
}
int main() {
ll xa, ya, xb, yb, xc, yc;
cin >> xa >> ya >> xb >> yb >> xc >> yc;
ll ans = 0;
ans = Abs(xa - xb) + Abs(ya - yb) + Abs(yc - yb) + Abs(xc - xb) - 1;
if (xa == xb && xb == xc) {
if ((ya < yb && yc < yb) || (ya > yb && yc > yb))
ans += 4;
cout << ans;
return 0;
}
if (ya == yb && yb == yc) {
if ((xa < xb && xc < xb) || (xa > xb && xc > xb))
ans += 4;
cout << ans;
return 0;
}
if ((xa <= xb && xc < xb) || (xa >= xb && xc > xb))
ans += 2;
if ((ya <= yb && yc < yb) || (ya >= yb && yc > yb))
ans += 2;
if ((ya < yb && yb < yc && xa > xb && xb > xc) || (ya > yb && yb > yc && xa < xb && xb < xc))
ans += 2;
if ((ya < yb && yb < yc && xa < xb && xb < xc) || (ya > yb && yb > yc && xa > xb && xb > xc))
ans += 2;
cout << ans;
return 0;
}
分类:
ACM / AtCoder 补题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】