单独算贡献

Posted zhujio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单独算贡献相关的知识,希望对你有一定的参考价值。

Problem - C - Codeforces

 

思路:

  计算每个数字出现次数,单独求每个数字的贡献,一共有m+1个数组

  假如出现了5次那就是 (m)+(m-1)+(m-2)+.....+(m-4),用首项加末项乘项数除以二计算,m代表多少个数组,i.second代表每个数字出现次数

  ans+=(m  + m + 1 -  i.second) * (i.second) / 2;

  计算每个数字出现次数需要优化,不然会超时

 

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\\n"
int main() 
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T = 1;
    cin >> T;

    while (T--)
    
        int n, m;
        cin >> n >> m;
        map<ll, ll>mp;
        vector<int>a(n + 1);
        for (int i = 1; i <= n; i++)cin >> a[i], mp[a[i]] = m + 1;
        ll ans = 0;
        for (int i = 1; i <= m; i++)
        
            int x, y;
            cin >> x >> y;
            mp[a[x]] -= m - i + 1;
            a[x] = y;
            mp[a[x]] += m - i + 1;
        
        for (auto i : mp) 
            ans += (m - 1 + m - i.second + 2) * (i.second) / 2;
        
        cout << ans << endl;
    
    return 0;

 

以上是关于单独算贡献的主要内容,如果未能解决你的问题,请参考以下文章

2020 China Collegiate Qinhuangdao Site G. Good Number(分段算贡献)

2019牛客国庆集训派对day2 J.Vertex Cover(思维,组合数学算贡献)

csps-99

一些期望问题

6486. GDOI2020模拟02.25向日葵人生

2018-2019 ACM-ICPC, China Multi-Provincial Collegiate G. Factories(树形dp+算贡献)