Problem - C - Codeforces

题目大意:有一长度为n的字符串a,有m次操作,每次操作将a中位置为x的数修改成y,从而产生一个新的数组,产生了m个数组后,将这m个数组和原数组a,两两融合并去重,产生m*(m+1)/2个数组,求这些数组中元素数量之和

1<=n,m<=2e5;1<=ai<=n+m

思路:可以发现如果一个数出现在某个Ai里出现,那么只有它与其他同样拥有这个数的Ai融合时才会出现贡献重复,需要排除一半的贡献,所以每个数字的贡献就是总的融合数组数量C(2,m+1)-没有贡献的融合数组数量A(2,该数在m+1和数组中出现的次数)/2,然后我们要解决的问题就是统计1到n+m的每个数在m+1个数组中出现的次数

因为在任意的数组中都没有重复的元素,所以我们记录每个数字上次出现的位置,a中的所有数都标为0,没出现的为-1,然后每次修改时,cnt[a[x]]+=当前修改次数i-上次出现位置pos[a[x]],并将pos[a[x]]置为-1,pos[y]=i,然后所有m次操作结束时,对于a数组中最后剩余的数cnt[a[i]]+=m+1-pos[a[i]],最后对于1到m+n的每个数字按之前推导的公式结果求和即可

//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
typedef long long ll;
ll app[N];
ll a[N];
ll cnt[N];
int main()
{int t;cin >> t;while (t--){ll n, m;cin >> n >> m;for (int i = 1; i <= n + m; i++){//对所有数字进行初始化app[i] = -1;cnt[i] = 0;}for (int i = 1; i <= n; i++){cin >> a[i];app[a[i]] = 0;//a数组中的数的出现位置记为0}for (int i = 1; i <= m; i++){int x, y;cin >> x >> y;cnt[a[x]] += i - app[a[x]];//a[x]在被修改前出现在了几个数组里app[a[x]] = -1;//重置a[x]出现位置a[x] = y;app[y] = i;//因为会有重复操作,y的操作必须在x之后}for (int i = 1; i <= n; i++){//记录当前a数组中剩余数的出现次数if (app[a[i]] != -1){cnt[a[i]] += m + 1 - app[a[i]];}}ll ans = 0;for (int i = 1; i <= n + m; i++){//对所有数统计答案ans += m * (m + 1) / 2 - (m - cnt[i]) * (m - cnt[i] + 1) / 2;}cout << ans << endl;}return 0;
}

C. Serval and Toxel‘s Arrays codeforces1789C相关推荐

  1. 【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 ...

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

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

  3. C. Serval and Toxel‘s Arrays(容斥+按值算贡献

    Problem - C - Codeforces 题意:一个 n 长的值成对不同数组,有 m 次变化,每次执行一次 p 位置,改为 v 值[保证每次改完的数组内的值成对不同],计算所有 m + 1 的 ...

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

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

  5. C. Serval and Toxel‘s Arrays

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

  6. cf----2019-09-22(Chocolates,Serval and Bus, Polycarp Restores Permutation)

    明若清溪天下绝歌 缱绻成说,不知该在哪处着墨:一生情深怎奈何世事 徒留斑驳,只一念痴恋成奢. You went to the store, selling nn types of chocolates ...

  7. Numpy掩码数组masked arrays,这一篇就够了

    Numpy掩码数组masked arrays,这一篇就够了 1. 什么是掩码数组 2.示例 2.1 一个例子走进掩码数组 2.2 创建一个数组第二个值是无效的 2.3 创建一个数组所有靠近1.e20的 ...

  8. JavaSE基础:Arrays工具类

    Java工具类: Arrays Arrays类是数组的操作类,定义在java.util包中,主要功能是实现数组元素的查找/数组内容的充填/排序等功能 1.排序数组的sort方法 重点:对数组元素进行排 ...

  9. Java学习笔记七——数组工具类Arrays

    数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组.若将里面的方法用熟的话,那开发效率会大大提高.下面介绍其中的方法. List<T> ...

最新文章

  1. Zookeeper 安装和配置
  2. php数据库查询中文方块,解决Python数据可视化中文部分显示方块问题
  3. SPCOMM的一些用法注意
  4. python网页爬虫-python网页爬虫浅析
  5. gcc选项 和 gdb 使用
  6. 搭建完全分布式的hadoop
  7. python基础数据类型一(元祖)
  8. bzoj1024 [SCOI2009]生日快乐 结论+dfs
  9. arm 饱和指令_ARM aarch64汇编学习笔记(九):使用Neon指令(一)
  10. css简单的数学运算
  11. 将WORD文档中整篇文章的自动编号消除,但原序号不变
  12. QLineEdit使用正则表达式小剖析
  13. php自动tag,帝国cms自动增加TAG关键字教程
  14. JS连接数据库(需配置odbc)
  15. 清空oracle的注册表,Oracle中清除注册表
  16. 一起撸过游戏的下铺兄弟,你还在玩游戏吗
  17. Pandas的介绍和使用
  18. 黄河金岸诗词大赛获奖作品选登(2:现代新诗)
  19. Java消息队列--ActiveMQ 实战
  20. 刷机大师独家支持android,刷机大师v3.4.5发布 独家支持荣耀6一键刷机

热门文章

  1. APM的L1制导算法改装思路
  2. 转——shell实用手册
  3. python拷贝文件到U盘
  4. 该怎么批量去掉视频的片头片尾?
  5. Windows10预装自带APP卸载和安装win10自带软件恢复
  6. LINUX网络流量限速控制
  7. 魔兽世界335 自动加入公会教程
  8. 自学UI设计必读书籍
  9. 沙师弟学Python多任务之线程
  10. live555 soure filter