C++计算给定序列在多次修改前后满足特定条件的极大匹配方案的大小

给定长度为n的整数序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an和长度为n的01序列 b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1,b2,...,bn
对于 1 ≤ i < j ≤ n 1\leq i<j\leq n 1i<jn,称二元组 ( i , j ) (i,j) (i,j)构成匹配当且仅当 b i = 0 b_i=0 bi=0 b j = 1 b_j=1 bj=1
定义极大匹配方案 S m a x S_{max} Smax为满足以下所有条件的二元组集合:

  • 对于任意 ( u , v ) ∈ S m a x (u,v)\in S_{max} (u,v)Smax 1 ≤ u < v ≤ n 1\leq u<v\leq n 1u<vn ( u , v ) (u,v) (u,v)构成匹配;
  • 每一个整数 1 ≤ i ≤ n 1\leq i\leq n 1in S m a x S_{max} Smax中出现至多一次;
  • 在满足以上条件的前提下,满足 a u = a v a_u=a_v au=av的二元组 ( u , v ) (u,v) (u,v)数量最多,即 ∑ ( u , v ) ∈ S m a x [ a u = a v ] \sum_{(u,v)\in S_{max}}[a_u=a_v] (u,v)Smax[au=av]最大;
  • 在满足以上条件的前提下, ∣ S m a x ∣ |S_{max}| Smax最大。
    给定m次修改,每次修改给出 x , p , q x,p,q x,p,q,表示将 ( a x , b x ) (a_x,b_x) (ax,bx)修改为 ( p , q ) (p,q) (p,q)
    需要用C++实现对于每个 1 ≤ i ≤ m + 1 1\leq i\leq m+1 1im+1求出:按输入顺序依次进行前 ( i − 1 ) (i-1) (i1)次操作后,极大匹配方案 S m a x S_{max} Smax的大小 ∣ S m a x ∣ |S_{max}| Smax

输入格式
从标准输入读入数据。
输入的第一行两个整数n,m,表示序列长度和操作次数。
第二行n个整数 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an描述序列a。
第三行n个整数 b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1,b2,...,bn描述序列b。
接下来m行每行三个整数x、p、q,描述一次修改。
输出格式
输出到标准输出。
输出m+1行,每行一个整数,第i行表示按输入顺序依次进行前 ( i − 1 ) (i-1) (i1)次操作后 ∣ S m a x ∣ |S_{max}| Smax的值。
样例输入

5 5
1 2 1 1 2
0 0 0 0 0
2 2 1
4 2 0
4 2 1
2 2 0
1 1 1

样例1的输出
- 输出内容为:

0
1
1
2
1
1
  • 样例1的解释
    - 初始情况,由于所有的 ( b_i ) 都等于 0,因此没有二元组构成匹配,极大匹配方案的大小为 0,故第一行输出 0。
    - 进行第一次修改后,( b_2 = 1 ),极大匹配方案为 ({ (1, 2) }),故第二行输出 1。
    - 进行前三次修改后,序列 ( a ) 为 1 2 1 2 2,序列 ( b ) 为 0 1 0 1 0。极大匹配方案为 ({ (1, 2), (3, 4) }),故第四行输出 2。注意此时 ((4, 5)) 有 ( b_4 = 1 ),( b_5 = 0 ),并不构成匹配。

样例2的输入
- 输入内容为:

10 10
2 1 2 2 2 2 1 2 2 2
1 1 0 0 0 0 1 0 0 0
3 2 0
5 1 0
9 1 1
4 2 1
8 1 1
2 1 0
1 2 1
8 2 0
1 1 1
9 1 0

样例2的输出

1
1
1
2
3
3
4
4
3
3
2

【子任务】
对于所有测试数据,
1 ≤ n ≤ 2 × 1 0 5 , 0 ≤ m ≤ 2 × 1 0 5 ; 1 \leq n \leq 2\times 10^5,0 \leq m \leq 2\times 10^5; 1n2×105,0m2×105;
对于 1 ≤ i ≤ n , 1 ≤ a i ≤ n , 0 ≤ b i ≤ 1 1 \leq i \leq n,1 \leq a_i \leq n,0 \leq b_i \leq 1 1in,1ain,0bi1;
每次修改中有 1 ≤ x ≤ n , 1 ≤ p ≤ n , 0 ≤ q ≤ 1 1 \leq x \leq n, 1 \leq p \leq n, 0 \leq q \leq 1 1xn,1pn,0q1
Subtask 1(10%): n ≤ 100 , m = 0 n \leq 100,m=0 n100,m=0
Subtask 2(15%): n ≤ 2 × 1 0 3 , m = 0 n \leq 2 \times 10^3,m=0 n2×103,m=0
Subtask 3(20%): m = 0 m=0 m=0
Subtask 4(15%): a i , p ≤ 2 a_i,p \leq 2 ai,p2
Subtask 5(20%): n , m ≤ 1 0 5 n,m \leq 10^5 n,m105
Subtask 6(20%):无特殊限制。

为了解决这个问题,我们需要找到一种高效的方法来计算在每次修改后的极大匹配方案的大小。这个问题的关键在于如何在动态修改后快速计算满足条件的配对数目。

这种方法通过动态维护每个值的0和1的数量,高效地计算每次修改后的极大匹配方案大小,确保了在O(1)时间复杂度内完成每次修改后的结果计算。

方法思路

  1. 问题分析:

    • 我们需要处理两个序列,一个整数序列和一个01序列。
    • 每次修改后,我们需要计算极大匹配方案的大小,该方案需要优先考虑相同值的配对,并且在满足该条件后尽可能多的配对。
  2. 关键观察:

    • 每个值a的0和1的数量决定了该值的有效配对数目。
    • 使用两个字典来维护每个值的0和1的数量。
    • 维护总0和总1的数量,以及一个变量来记录所有值的有效配对数目总和。
  3. 算法步骤:

    • 初始化时统计每个值的0和1的数量,以及总0和总1的数量。
    • 每次修改时更新相关值的信息,并动态维护有效配对数目总和。
    • 计算剩余0和1的数量,并基于这些剩余数量计算最终的配对数目。

解决代码

#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m;cin >> n >> m;vector<int> a(n);vector<int> b(n);for (int i = 0; i < n; ++i) {cin >> a[i];}for (int i = 0; i < n; ++i) {cin >> b[i];}unordered_map<int, int> c0, c1;int total0 = 0, total1 = 0;long long sum_pair = 0;auto update = [&](int old_a, int old_b, int delta) {sum_pair -= min(c0[old_a], c1[old_a]);if (old_b == 0) {c0[old_a] += delta;if (c0[old_a] == 0) c0.erase(old_a);} else {c1[old_a] += delta;if (c1[old_a] == 0) c1.erase(old_a);}sum_pair += min(c0[old_a], c1[old_a]);};for (int i = 0; i < n; ++i) {int val = a[i];int bit = b[i];if (bit == 0) {c0[val]++;total0++;} else {c1[val]++;total1++;}}for (auto it = c0.begin(); it != c0.end();) {int key = it->first;sum_pair += min(it->second, c1[key]);++it;}for (auto it = c1.begin(); it != c1.end();) {int key = it->first;if (c0.find(key) == c0.end()) {sum_pair += min(0, it->second);}++it;}cout << sum_pair + min(total0 - sum_pair, total1 - sum_pair) << '\n';for (int i = 0; i < m; ++i) {int x, p, q;cin >> x >> p >> q;x--;int old_a = a[x];int old_b = b[x];int new_a = p;int new_b = q;sum_pair -= min(c0[old_a], c1[old_a]);if (old_b == 0) {c0[old_a]--;total0--;if (c0[old_a] == 0) c0.erase(old_a);} else {c1[old_a]--;total1--;if (c1[old_a] == 0) c1.erase(old_a);}sum_pair += min(c0[old_a], c1[old_a]);sum_pair -= min(c0[new_a], c1[new_a]);if (new_b == 0) {c0[new_a]++;total0++;} else {c1[new_a]++;total1++;}sum_pair += min(c0[new_a], c1[new_a]);a[x] = new_a;b[x] = new_b;long long rest0 = total0 - sum_pair;long long rest1 = total1 - sum_pair;long long ans = sum_pair + min(rest0, rest1);cout << ans << '\n';}return 0;
}

代码解释

  • 初始化: 读取输入并初始化每个值的0和1的数量,以及总0和总1的数量。
  • 更新函数: 用于动态维护每个值的0和1的数量变化,并更新有效配对数目总和。
  • 处理初始状态: 计算初始的有效配对数目总和,并输出初始结果。
  • 处理每次修改: 更新相关值的信息,重新计算有效配对数目总和,并输出当前结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强化学习笔记(3)——基于值函数的方法和策略梯度方法

分为两大类方法&#xff1a; 基于值函数的方法&#xff08;Temporal Difference Methods, TD Methods&#xff09; 策略梯度方法&#xff08;Policy Gradient Methods&#xff09;。 二者不同之处&#xff1a; 通过值函数来间接表达隐式的策略&#xff0c;一个是直接迭代优化策…

Excel 技巧23 - 在Excel中用切片器做出查询效果(★★★)

本文讲如何在Excel中用切片器做出查询效果。 目录 1&#xff0c;在Excel中用切片器做出查询效果 1-1&#xff0c;Excel 中的切片器是什么&#xff1f; 1-2&#xff0c;用切片器做出查询效果 1&#xff09;&#xff0c;点击任一表格内单元格&#xff0c;按下CtrlA&#xff0…

leetcode——排序链表(java)

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&#xff1a; …

苯乙醇苷类化合物的从头生物合成-文献精读108

Complete pathway elucidation of echinacoside in Cistanche tubulosa and de novo biosynthesis of phenylethanoid glycosides 管花肉苁蓉中松果菊苷全生物合成途径解析及苯乙醇苷类化合物的从头生物合成 摘要 松果菊苷&#xff08;ECH&#xff09;是最具代表性的苯乙醇苷…

AnyThingLLM本地私有知识库搭建

***************************************************** 环境准备 操作系统&#xff1a;Windows11 内存&#xff1a;32GB RAM 存储&#xff1a;预留 300GB 可用空间 显存: 16G 网络: 100M带宽 前置准备: 已安装ollama环境 deepseek本地大模型 ***************************…

【设计测试用例自动化测试性能测试 实战篇】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 设计测试用例…

99.23 金融难点通俗解释:小卖部经营比喻PPI(生产者物价指数)vsCPI(消费者物价指数)

目录 0. 承前1. 简述&#xff1a;价格指数对比2. 比喻&#xff1a;两大指数对比2.1 简单对比2.2 生动比喻 3. 实际应用3.1 价格传导现象 4. 总结5. 有趣的对比6. 数据获取实现代码7. 数据可视化实现代码 0. 承前 本文主旨&#xff1a; 本文使用小卖部比喻PPI和CPI&#xff0c;…

【项目初始化】

项目初始化 使用脚手架创建项目Vite创建项目推荐拓展 使用脚手架创建项目 Vite Vite 是一个现代的前端构建工具&#xff0c;它提供了极速的更新和开发体验&#xff0c;支持多种前端框架&#xff0c;如 Vue、React 等创建项目 pnpm create vuelatest推荐拓展

开源智慧园区管理系统如何重塑企业管理模式与运营效率

内容概要 在如今快速发展的商业环境中&#xff0c;企业面临着日益复杂的管理挑战。开源智慧园区管理系统应运而生&#xff0c;旨在通过技术创新来应对这些挑战。它不仅是一个简单的软件工具&#xff0c;而是一个全面整合大数据、物联网和智能化功能的综合平台&#xff0c;为企…

stm32教程:EXTI外部中断应用

早上好啊大佬们&#xff0c;上一期我们讲了EXTI外部中断的原理以及基础代码的书写&#xff0c;这一期就来尝试一下用它来写一些有实际效能的工程吧。 这一期里&#xff0c;我用两个案例代码来让大家感受一下外部中断的作用和使用价值。 旋转编码器计数 整体思路讲解 这里&…

护眼好帮手:Windows显示器调节工具

在长时间使用电脑的过程中&#xff0c;显示器的亮度和色温对眼睛的舒适度有着重要影响。传统的显示器调节方式不仅操作繁琐&#xff0c;而且在低亮度下容易导致色彩失真。因此&#xff0c;今天我想为大家介绍一款适用于Windows系统的护眼工具&#xff0c;它可以帮助你轻松调节显…

Mysql进阶学习

目录 一.Mysql服务器内部架构(了解) 二.Mysql引擎 2.1 innodb引擎 2.2 myisam引擎 三.索引 3.1索引分类 3.2mysql索引数据结构 3.3聚簇索引和非聚簇索引 3.4回表查询 3.5索引下推 四.事务 数据库事务特征 事务隔离性&#xff0c;隔离级别 事务实现原理 五.锁 ①…

解锁维特比算法:探寻复杂系统的最优解密码

引言 在复杂的技术世界中&#xff0c;维特比算法以其独特的魅力和广泛的应用&#xff0c;成为通信、自然语言处理、生物信息学等领域的关键技术。今天&#xff0c;让我们一同深入探索维特比算法的奥秘。 一、维特比算法的诞生背景 维特比算法由安德鲁・维特比在 1967 年提出…

使用 postman 测试思源笔记接口

思源笔记 API 权鉴 官方文档-中文&#xff1a;https://github.com/siyuan-note/siyuan/blob/master/API_zh_CN.md 权鉴相关介绍截图&#xff1a; 对应的xxx&#xff0c;在软件中查看 如上图&#xff1a;在每次发送 API 请求时&#xff0c;需要在 Header 中添加 以下键值对&a…

sizeof和strlen的对比与一些杂记

1.sizeof和strlen的对比 1.1sizeof &#xff08;1&#xff09;sizeof是一种操作符 &#xff08;2&#xff09;sizeof计算的是类型或变量所占空间的大小&#xff0c;单位是字节 注意事项&#xff1a; &#xff08;1&#xff09;sizeof 返回的值类型是 size_t&#xff0c;这是一…

实测数据处理(Wk算法处理)——SAR成像算法系列(十二)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《wk算法-SAR成像算法系列&#xff08;五&#xff09;》 文章目录 前言 一、算法流程 1.1、回波信号生成 2.2 Stolt插值 2.3 距离脉冲压缩 2.4 方位脉冲压缩 2.5 SAR成像 二、仿真实验 2.1、仿真参数…

FFmpeg rtmp推流直播

文章目录 rtmp协议RTMP协议组成RTMP的握手过程RTMP流的创建RTMP消息格式Chunking(Message 分块) rtmp服务器搭建Nginx服务器配置Nginx服务器 librtmp库编译推流 rtmp协议 RTMP&#xff08;Real Time Messaging Protocol&#xff09;是由Adobe公司基于Flash Player播放器对应的…

docker搭建redis集群(三主三从)

本篇文章不包含理论解释&#xff0c;直接开始集群&#xff08;三主三从&#xff09;搭建 环境 centos7 docker 26.1.4 redis latest &#xff08;7.4.2&#xff09; 服务器搭建以及环境配置 请查看本系列前几篇博客 默认已搭建好三个虚拟机并安装配置好docker 相关博客&#xf…

接口使用实例(2)

大家好&#xff0c;今天我们来解答一下昨天留下的一个问题&#xff0c;并且继续来看一些接口使用实例。 通过String类中重写的方法compareTo来实现我们的比较name的需求&#xff1a; 2,用Comparator接口来实现类的比较(比较器) 了解即可&#xff0c;以后会详细讲。 知识点:C…

基于Springboot的社区药房管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…