AtCoder Beginner Contest 378 题解
AtCoder Beginner Contest 378
Rated:
场切:ABCD
赛后:EF
不会:G
-
A - Pairing
简单模拟。
-
B - Garbage Collection
找到一个大于等于
的最小值,满足模 。
简单分讨。 -
C - Repeating
简单模拟。
-
D - Count Simple Paths
纯DFS。
枚举每个起点,暴力搜索统计答案。 -
E - Mod Sigma Problem
假设
,那么由于
,所以不再涉及
。让
( 与 的个数),那么 可以用值域树状数组或值域线段树来计算。 定义为 的个数,
对每个 执行以下操作:细节:当
时,执行add(S[i],1)
时,lowbit(S[i]) 会一直为 ,会死循环。所以给每个 维护。点击查看代码
#include <bits/stdc++.h> using namespace std; const int N = 200005; long long a[N],tr[N]; long long n,m; int lowbit(int x){ return x & -x; } void add(int x,int k){ for (int i = x; i <= m;i+=lowbit(i)) tr[i] += k; } int query(int x){ long long sum = 0; for (int i = x; i;i-=lowbit(i)) sum += tr[i]; return sum; } int main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin >> n >> m; for (int i = 1; i <= n;i++) cin >> a[i], a[i] = (a[i]+a[i - 1])%m; long long tmp = 0,ans=0; for (int i = 1; i <= n;i++){ ans += a[i] * i; ans -= tmp; ans += (query(m) - query(a[i]+1))*m; add(a[i]+1, 1); tmp += a[i]; } cout << ans << endl; return 0; }
-
F - Add One Edge 2
计算满足以下条件的顶点对
(其中 )的个数: 和 的度数都是 。 和 的简单路径上的所有顶点(不包括 和 本身)的度数都是 。
并查集维护,给每个顶点度数都为
的边合并。
设 表示第 个连通块中,与联通块中的点有连边的,且度数为 的点的数量。答案就是
。点击查看代码
#include <bits/stdc++.h> using namespace std; const int N = 200005; int n; int u[N], v[N], deg[N], fa[N]; int c2[N]; int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } void merge(int x, int y) { int fx = find(x),fy = find(y); fa[fx] = fy; } vector<vector<int>> f() { unordered_map<int, vector<int>> t; for (int i = 0; i < n; ++i) { int rt = find(i); t[rt].push_back(i); } vector<vector<int>> ans; for (const auto& tmp : t) { ans.push_back(tmp.second); } return ans; } signed main() { cin >> n; for (int i = 1; i <= n - 1; i++) { cin >> u[i] >> v[i]; u[i]--;v[i]--; deg[u[i]]++;deg[v[i]]++; } for (int i = 0; i < n; ++i) fa[i] = i; for (int i = 1; i <= n - 1; ++i) { if (deg[u[i]] == 3 && deg[v[i]] == 3) merge(u[i], v[i]); else if (deg[u[i]] == 3 && deg[v[i]] == 2) c2[u[i]]++; else if (deg[u[i]] == 2 && deg[v[i]] == 3) c2[v[i]]++; } long long ans = 0; for (const auto& g : f()) { long long cnt = 0; for (int v : g) cnt += c2[v]; ans += cnt * (cnt - 1) / 2; } cout << ans << endl; return 0; }
-
G - Everlasting LIDS
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库