单独算贡献
Posted zhujio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单独算贡献相关的知识,希望对你有一定的参考价值。
思路:
计算每个数字出现次数,单独求每个数字的贡献,一共有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(思维,组合数学算贡献)
2018-2019 ACM-ICPC, China Multi-Provincial Collegiate G. Factories(树形dp+算贡献)