AtCoder Beginner Contest 378 题解

AtCoder Beginner Contest 378

Rated: 760770
场切:ABCD
赛后:EF
不会:G

  • A - Pairing

    简单模拟。

  • B - Garbage Collection

    找到一个大于等于 d 的最小值,满足模 q=r
    简单分讨。

  • C - Repeating

    简单模拟。

  • D - Count Simple Paths

    纯DFS。
    枚举每个起点,暴力搜索统计答案。

  • E - Mod Sigma Problem

    假设 Si=(A1+A2++Ai)modM,S0=0,那么

    1lrN((lirAi)modM)=1lrN(SrSl1)modM,

    由于 0Sl1,Sr<M ,所以

    (SrSl1)modM=SrSl1+{0(Sl1Sr)M(Sl1>Sr)

    不再涉及 mod

    Xr=l=1,2,,rSl1>Sr 的个数),那么

    r=1Nl=1r(SrSl1)modM=r=1N(Sr×rl=1rSl1+M×Xr).

    Xr 可以用值域树状数组值域线段树来计算。

    Bx 定义为 Sl1=x 的个数,
    对每个 r=0,1,,N 执行以下操作:

    • Xr=BSr+1+BSr+2+BM1
    • BSr+1

    细节:当 Si=0 时,执行 add(S[i],1) 时,lowbit(S[i]) 会一直为 0,会死循环。所以给每个 Si+1 维护。

    点击查看代码
    #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

    计算满足以下条件的顶点对 (u,v) (其中 u<v )的个数:

    • uv 的度数都是 2
    • uv 的简单路径上的所有顶点(不包括 uv 本身)的度数都是 3

    并查集维护,给每个顶点度数都为 3 的边合并。
    ci 表示第 i 个连通块中,与联通块中的点有连边的,且度数为 2 的点的数量。

    答案就是 i=1ci(ci1)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

    官方题解

posted @   Star_F  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示