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;一个是直接迭代优化策…

柱量最大值转向

• 在MACD指标中&#xff0c;柱状线在0轴之上时用红色柱线表示&#xff0c;简称为“红柱”。 • 在上涨过程中&#xff0c;柱状线会在0轴之上不断向上发散&#xff0c;这是由于快线DIF带动慢线DEA向上运行&#xff0c;并且DIF不断远离DEA。 2. 上涨动能的变化&#xff1a;…

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

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

Java 性能优化与新特性

Java学习资料 Java学习资料 Java学习资料 一、引言 Java 作为一门广泛应用于企业级开发、移动应用、大数据等多个领域的编程语言&#xff0c;其性能和特性一直是开发者关注的重点。随着软件系统的规模和复杂度不断增加&#xff0c;对 Java 程序性能的要求也越来越高。同时&a…

01.04、回文排序

01.04、[简单] 回文排序 1、题目描述 给定一个字符串&#xff0c;编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。 2、解题思路 回文串的特点&#xff1a; 一个回文串在…

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; …

python开发,最好的环境是什么

目录 1. 集成开发环境&#xff08;IDE&#xff09; 1.1 PyCharm 1.2 Visual Studio Code (VSCode) 2. 文本编辑器 2.1 Sublime Text 2.2 Vim/NeoVim 3. 虚拟环境管理 4. 版本控制与协作 5. 容器化开发 6. 项目管理与依赖管理工具 7. 单元测试与调试 最佳组合推荐 …

苯乙醇苷类化合物的从头生物合成-文献精读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;为什么不能是我呢 设计测试用例…

幸运数字——蓝桥杯

1.问题描述 哈沙德数是指在某个固定的进位制当中&#xff0c;可以被各位数字之和整除的正整数。例如 126126 是十进制下的一个哈沙德数&#xff0c;因为 (126)10mod(126)0&#xff1b;126 也是八进制下的哈沙德数&#xff0c;因为 (126)10(176)8&#xff0c;(126)10​mod(176)…

动态规划DP 最长上升子序列模型 拦截导弹(题目分析+C++完整代码)

概览检索 动态规划DP 最长上升子序列模型 拦截导弹 原题链接 AcWiing 1010. 拦截导弹 题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#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;…

electron 应用开发实践

参考链接&#xff1a; https://blog.csdn.net/2401_83384536/article/details/140549279

【项目初始化】

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

计算机网络一点事(21)

第四章 网络层 功能&#xff1a;服务传输层&#xff0c;封装ip数据报&#xff08;主机到主机&#xff09; IP地址以32b表示&#xff0c;以8b为一组记十进制数 异构网络互连&#xff1a;网络结构&#xff0c;主机类型不同 路由器相互配合出IP数据报生成表&#xff0c;根据表…

LeetCode题练习与总结:两个列表的最小索引总和--599

一、题目描述 假设 Andy 和 Doris 想在晚餐时选择一家餐厅&#xff0c;并且他们都有一个表示最喜爱餐厅的列表&#xff0c;每个餐厅的名字用字符串表示。 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个&#xff0c;则输出所有答案并且不考虑顺序。…

PyDeequ库在AWS EMR启动集群中数据质量检查功能的配置方法和实现代码

PyDeequ是一个基于Apache Spark的Python API&#xff0c;专门用于定义和执行“数据单元测试”&#xff0c;从而在大规模数据集中测量数据质量。 PyDeequ框架在PySpark代码中提供了全面的数据质量检查功能&#xff0c;能够帮助用户&有效地监控和提升大规模数据集的数据质量。…

React第二十八章(css modules)

css modules 什么是 css modules 因为 React 没有Vue的Scoped&#xff0c;但是React又是SPA(单页面应用)&#xff0c;所以需要一种方式来解决css的样式冲突问题&#xff0c;也就是把每个组件的样式做成单独的作用域&#xff0c;实现样式隔离&#xff0c;而css modules就是一种…

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

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