Problem - C - Codeforces

题意:一个 n 长的值成对不同数组,有 m 次变化,每次执行一次 p 位置,改为 v 值【保证每次改完的数组内的值成对不同】,计算所有 m + 1 的数组两两去重合并之后不同的数的个数的和;

分析:由于确保两两必然不同,很好想到这题的关键在于值而非位置,对于每个值算贡献 —— 因为同样的值,产生贡献的情况要不是 1 ,要不是 2,对于合并后数组内有两个相同值的贡献很好算 —— 就是,但是 1 的情况实在不好想,想了一段时间突然发现确实难算,后来想到容斥一下就行了 —— 总数 m * (m - 1) / 2 * n * 2;

所以最终就是 总数减去重复计算的即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 15;
const int mo = 998244353;
#define pb push_back
#define pii pair<int,int>
#define ft first
#define sd second
#define ffor(i,a,b,c) for(int i=(a);i<(b);i+=(c))
#define For(i,a,b,c) for(int i=(a);i<=(b);i+=(c))
#define rfor(i,a,b,c) for(int i=(a);i>(b);i-=(c))
#define Rfor(i,a,b,c) for(int i=(a);i>=(b);i-=(c))
#define all(x) (x).begin(), (x).end()
#define debug1(x) cerr<<"! "<<x<<endl;
#define debug2(x,y) cerr<<"#  "<<x<<" "<<y<<endl;void slv() {int n, m; cin >> n >> m;vector<int>a(n + 1);vector<int> nm(n + m + 1), pr(n + m + 1, -1);For(i, 1, n, 1) {cin >> a[i];nm[a[i]]++;pr[a[i]] = 1;}For(i, 2, m + 1, 1) {int p, v; cin >> p >> v;int u = a[p];if (v == u) continue;nm[v] += 1;pr[v] = i;a[p] = v;nm[u] += (i - pr[u] - 1);pr[u] = -1;}For(i, 1, n + m, 1) {if (pr[i] != -1) {nm[i] += m + 1 - pr[i];}}ll tot = 1ll * (m + 1) * m * n;For(i, 1, n + m, 1) {if (nm[i]) {tot -= 1ll * (nm[i] - 1) * nm[i] / 2;}}cout << tot << '\n';
}
int main() {ios::sync_with_stdio(false); cin.tie(0);int t; cin >> t;while (t--) {slv();}
}

C. Serval and Toxel‘s Arrays(容斥+按值算贡献相关推荐

  1. Codeforces Round #853 (Div. 2) C. Serval and Toxel‘s Arrays【统计次数,算贡献】

    链接 传送门 分析 这道题想法其实很简单,样例的计算方法一定要看懂.以样例1为例,根据他的操作方法可以得到两个新的数组,和一个原来的数组,总共三个数组. 1 2 3 4 2 3 4 5 3 他们两两配 ...

  2. 【Codeforces Round #853 (Div. 2)】C. Serval and Toxel‘s Arrays【题解】

    题目 Toxel likes arrays. Before traveling to the Paldea region, Serval gave him an array a a a as a gi ...

  3. C. Serval and Toxel‘s Arrays(数学贡献法)

    Problem - C - Codeforces Toxel喜欢数组.在前往帕尔迪亚地区之前,塞瓦尔给了他一个阵列作为礼物.这个数组有n个成对不同的元素.为了获得更多的数组,Toxel对初始数组进行了 ...

  4. C. Serval and Toxel‘s Arrays

    传送门 题目 给你一个长度为n的数组和m次修改,每次修改会将其中的一个数字修改成另一个数字然后形成一个新数组,初始数组和修改过程的数组保证没有相同的数字,问你所有任意两个数组之间去重之后元素的数量的和 ...

  5. C. Serval and Toxel‘s Arrays codeforces1789C

    Problem - C - Codeforces 题目大意:有一长度为n的字符串a,有m次操作,每次操作将a中位置为x的数修改成y,从而产生一个新的数组,产生了m个数组后,将这m个数组和原数组a,两两 ...

  6. ARC115E-LEQ and NEQ【容斥,dp,线段树】

    正题 题目链接:https://atcoder.jp/contests/arc115/tasks/arc115_d 题目大意 nnn个数字的序列xxx,第xi∈[1,Ai]∩Zx_i\in [1,A_ ...

  7. HDU6106(容斥问题)

    题目:https://acm.hdu.edu.cn/showproblem.php?pid=6106 思路: 把题目给的七个数据画出文氏图,根据容斥定理就可以算出每个班的人数 AC代码: //容斥定理 ...

  8. Leetcode 552.学生出勤记录‖ 动态规划+容斥

    题目链接:传送门 可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent,缺勤 'L':Late,迟到 'P':P ...

  9. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

最新文章

  1. C语言数组只会输出两个!_只愿与一人十指紧扣_新浪博客
  2. 图像与视频合成领域的集大成者,都在这里了!
  3. android ramdisk
  4. 安装Red Hat Container Development Kit 2.2版本
  5. 汇编[bx+idata](8086)
  6. 洛谷-求同构数的个数-NOIP2013提高组复赛
  7. 小程序 webview 分享_新的一周,分享15个好玩的小程序
  8. python压缩和读取.tar.bz2格式的压缩包
  9. POJ NOI MATH-7651 自来水供给
  10. POJ 1952 DP
  11. matlab 发微信,微信红包算法MATLAB实现
  12. GC overhead limit exceeded填坑心得
  13. java 相关最新技术_你必须掌握的 21 个 Java 核心技术!
  14. python 网格搜索_Python机器学习笔记:Grid SearchCV(网格搜索)
  15. pdf复制json不全的问题
  16. Lrc文件与音乐的同步显示
  17. 两直线平行交叉相乘_两条直线方程相乘的几何意义 是不是说两相交直线的点的轨迹...
  18. 图像JPEGEXIF格式介绍(一)
  19. 几款好用的UML建模工具
  20. 39-网上商城数据库-用户信息数据操作

热门文章

  1. h3ch200虚拟服务器,H3C H200如何配置DDNS
  2. Mysql知识点一网打尽——学习提纲
  3. 小米10 MIUI 12 Magisk root教程(无需刷REC)
  4. WV.30-大数阶乘算法10-用Stirling逼近近似计算阶乘的探讨与应用
  5. ros配置安川gp88
  6. 基于linker实现so加壳技术下
  7. 解决HDMI屏幕有视频但无声音输出
  8. F1V3.0-图形-地图模块主要对象说明
  9. 魅族flashfire_魅族pro6S获取完全root权限!!
  10. linux建立文件的符号链接,如何在Linux中创建符号链接[完整指南]