Educational Codeforces Round 165 (Rated for Div. 2) E. Unique Array 贪心+线段树

Unique Array

题目描述

给你一个长度为 n n n 的整数数组 a a a a a a 的子数组是其连续的子序列之一(即数组 [ a l , a l + 1 , … , a r ] [a_l, a_{l+1}, \dots, a_r] [al,al+1,,ar] 中的某个整数 l l l r r r 的子数组 1 ≤ l < r ≤ n 1 \le l < r \le n 1l<rn )。如果一个整数在子数组中出现的次数正好是一次,那么这个子数组就是唯一的。

您可以执行以下操作任意多次(可能为零):从数组中选择一个元素,然后用任意整数替换它。

你的任务是计算上述操作的最少次数,以使数组 a a a 的所有子数组都是唯一的。

输入描述

第一行包含一个整数 t t t ( 1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1t104 ) - 测试用例数。

每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 3 ⋅ 1 0 5 1 \le n \le 3 \cdot 10^5 1n3105 )。

第二行包含 n n n 个整数 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,,an ( 1 ≤ a i ≤ n 1 \le a_i \le n 1ain )。

所有测试用例中 n n n 的总和不超过 3 ⋅ 1 0 5 3 \cdot 10^5 3105

输出描述

对于每个测试用例,打印一个整数 - 为了使数组 a a a 的所有子数组都是唯一的,上述操作的最少次数。

样例输入

4
3
2 1 2
4
4 4 4 4
5
3 1 2 1 2
5
1 3 2 1 2

样例输出

0
2
1
0

原题

CF——传送门

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;// 线段树维护idx+1到i中的每个l对应的[l,i]的总和
vector<int> tr, p; // tr为线段树数组,p为懒标记void pushdown(int v) // 向下更新
{if (v * 2 + 2 >= int(tr.size()))return;// 更新子节点tr[v * 2 + 1] += p[v];tr[v * 2 + 2] += p[v];// 下传懒标记p[v * 2 + 1] += p[v];p[v * 2 + 2] += p[v];p[v] = 0; // 清空懒标记
}void updata(int v, int l, int r, int L, int R, int x) // 区间更新
{if (L >= R)return;if (l == L && r == R){tr[v] += x;p[v] += x; // 打上懒标记return;}int m = (l + r) / 2;pushdown(v);updata(v * 2 + 1, l, m, l, min(m, R), x);updata(v * 2 + 2, m, r, max(m, L), R, x);tr[v] = min(tr[v * 2 + 1], tr[v * 2 + 2]);
}int query(int v, int l, int r, int L, int R) // 区间询问
{if (L >= R) // 只有一个数,则不可能为非唯一子数组return 1e9;if (l == L && r == R)return tr[v];int m = (l + r) / 2;pushdown(v);return min(query(v * 2 + 1, l, m, l, min(m, R)),query(v * 2 + 2, m, r, max(m, L), R));
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;cin >> t;while (t--){int n;cin >> n;vector<int> a(n);for (int i = 0; i < n; i++){cin >> a[i];a[i]--;}tr = vector<int>(4 * n, 0);p = vector<int>(4 * n, 0);vector<vector<int>> pos(n); // 当前某个值对应的全部位置int cnt = 0;                // 最少修改次数int idx = -1;               // 维护替换的最后一个元素的索引idx,初始化为-1for (int i = 0; i < n; i++){int x = a[i];pos[x].push_back(i);int k = pos[x].size();if (k > 0)updata(0, 0, n, idx + 1, pos[x][k - 1] + 1, 1); // 当前位置向左遍历第一次出现的位置赋值为1if (k > 1)updata(0, 0, n, idx + 1, pos[x][k - 2] + 1, -2); // 当前位置向左遍历第二次出现的位置赋值为-1if (k > 2)updata(0, 0, n, idx + 1, pos[x][k - 3] + 1, 1); // 当前位置向左遍历出现第三次即以上的位置赋值为0if (query(0, 0, n, idx + 1, i + 1) == 0)            // 如果在这个范围内找到非唯一子数组,修改i位置,答案++{cnt++;idx = i;}}cout << cnt << '\n';}return 0;
}

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

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

相关文章

如何检查 MIDI 文件的安全性

检查 MIDI 文件的安全性通常涉及几个步骤&#xff0c;因为 MIDI 文件本身并不包含可执行代码&#xff0c;所以它们不是传统意义上的恶意软件载体。然而&#xff0c;它们仍然可能以间接的方式带来安全风险&#xff0c;例如通过诱导用户下载与 MIDI 文件一起提供的恶意附件或链接…

JS基础:变量的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃&#xff0c;大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端基础路线”&#xff0c;可获取…

Leetcode181_超过经理收入的员工

1.leetcode原题链接:. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 表&#xff1a;Employee ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | salary | int | | manage…

零基础入门学习Python第二阶01生成式(推导式),数据结构

Python语言进阶 重要知识点 生成式&#xff08;推导式&#xff09;的用法 prices {AAPL: 191.88,GOOG: 1186.96,IBM: 149.24,ORCL: 48.44,ACN: 166.89,FB: 208.09,SYMC: 21.29}# 用股票价格大于100元的股票构造一个新的字典prices2 {key: value for key, value in prices.i…

病毒及网络攻击(信息安全)

一、病毒 计算机病毒的特征&#xff1a;传播性、隐蔽性、感染性、潜伏性、触发性、破坏性等 Worm -- 蠕虫病毒 Trojan -- 特洛伊木马 Backdoor -- 后门病毒 Macro -- 宏病毒 宏病毒 感染的对象主要是 文本文档、电子表格等 木马病毒&#xff1a;冰河 蠕虫病毒&#xff1a;欢乐时…

Java的java.util.concurrent.ExecutorService简介

在Java并发编程的璀璨星空中&#xff0c;ExecutorService无疑是那颗最耀眼的明星。它不仅是Java并发编程的核心组件之一&#xff0c;更是构建高并发、高性能应用的秘密武器。今天&#xff0c;我们就来一场说走就走的探索之旅&#xff0c;揭开它的神秘面纱&#xff01; &#x1…

关于排序算法这一篇就够了

排序算法是计算机科学中的一个基本问题&#xff0c;它涉及到将一组数据元素&#xff08;如整数、浮点数、字符串等&#xff09;按照某种顺序&#xff08;如升序或降序&#xff09;进行排列。以下是您提到的几种排序算法的概念和相应的Java实现&#xff1a; 1. 冒泡排序&#x…

已解决javax.sound.sampled.LineUnavailableException异常的正确解决方法,亲测有效!!!

已解决javax.sound.sampled.LineUnavailableException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 检查音频设备是否被其他应用占用 确认音频格式设置 更新或重装音频驱动…

深度学习中的不确定性量化:技术、应用和挑战综述(一)

不确定性量化(UQ)在减少优化和决策过程中的不确定性方面起着关键作用&#xff0c;应用于解决各种现实世界的科学和工程应用。贝叶斯近似和集成学习技术是文献中使用最广泛的两种UQ方法。在这方面&#xff0c;研究人员提出了不同的UQ方法&#xff0c;并测试了它们在各种应用中的…

vscode查看linux内核代码报错“Unknown argument:“无法跳转函数问题

vscode查看linux内核代码报错问题 现在一直使用bearclangdvscode查看代码&#xff0c; 今天用gcc 9.4.0版本编译Linux 6.6内核代码&#xff0c;编译后发现无法函数跳转。 vscode报错信息如下&#xff1a; Unknown argument: -fconserve-stack Unknown argument: -femit-stru…

Ansible自动化运维工具单模块介绍

前言 自动化运维是指利用自动化工具和技术来简化、自动化和优化IT基础设施的管理和运维过程&#xff0c;从而提高效率、降低成本&#xff0c;并减少人为错误。在当今复杂的IT环境中&#xff0c;自动化运维已经成为许多组织和企业提高生产力和保证系统稳定性的重要手段。Ansibl…

动态规划算法:路径问题

例题一 解法&#xff08;动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于这种「路径类」的问题&#xff0c;我们的状态表⽰⼀般有两种形式&#xff1a; i. 从 [i, j] 位置出发&#xff0c;巴拉巴拉&#xff1b; ii. 从起始位置出…

使用Simcenter全面评估SiC 器件的特性

内容摘要 传统的硅金属-氧化物-半导体场效应晶体管 (MOSFET) 具有成熟的技术和低廉的成本&#xff0c;在中压和绝缘栅双极晶体管 (IGBT) 高压功率电子器件中占主导地位。使用碳化硅等具有高电离能的新型宽带隙材料&#xff0c;可以制造出具有快速开关时间和超过1,000伏击穿电压…

博客网站SpringBoot+Vue项目练习

博客网站SpringBootVue简单案例 前言 学了vue后一直没用找到应用的机会&#xff0c;在Github上找到了一个看起来比较友好的项目&#xff08;其实具体代码我还没看过&#xff09;。而且这个项目作者的readme文档写的也算是比较好的了。 项目链接&#xff1a;https://github.c…

【LeetCode刷题】739. 每日温度(单调栈)

1. 题目链接2. 题目描述3. 解题方法4. 代码 1. 题目链接 739. 每日温度 2. 题目描述 3. 解题方法 用一个栈st保存每个数的下标&#xff0c;同时创建一个数组res保存结果&#xff0c;初始值都为0。循环遍历题目中的数组temperature。如果temperature[i] > st.top()&#x…

MATLAB和Python网格桁架框架构件刚度载荷位移和受力微分方程

&#x1f3af;要点 数学​方法​&#xff1a;&#x1f3af;一维线性边界值问题&#xff1a;&#x1f58a;高斯求积法则 | &#x1f58a;洛巴托求积法则 | &#x1f58a;矩阵插值和微分计算 | &#x1f58a;在细化网格上生成值。&#x1f3af;二维边界值问题&#xff1a;构建二…

Linux--IIC驱动编程实验

对于 I2C 主机驱动&#xff0c;一旦编写完成就不需要再做修改&#xff0c;其他的 I2C 设备直接调用主机驱动提供的 API 函数完成读写操作即可。这个正好符合 Linux 的驱动分离与分层的思想&#xff0c;因此 Linux内核也将 I2C 驱动分为两部分&#xff1a; ①、 I2C 总…

虚拟化之---virtio通信

一、理解virtio的背景 我们知道虚拟化hypervisor大的类型分为两种&#xff0c;全虚拟化和半虚拟化。 在全虚拟化的解决方案中&#xff0c;guest VM 要使用底层 host 资源&#xff0c;需要 Hypervisor 来截获所有的请求指令&#xff0c;然后模拟出这些指令的行为&#xff0c;这样…

Java毕设之学院党员管理系统的设计与实现

运行环境 环境说明: 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) Maven包:Maven3.3.9 系统实现 管理员功能实现 党员管理 管理员进入指定功能操作…

算法学习:二分查找

&#x1f525; 引言 在现代计算机科学与软件工程的实践中&#xff0c;高效数据检索是众多应用程序的核心需求之一。二分查找算法&#xff0c;作为解决有序序列查询问题的高效策略&#xff0c;凭借其对数时间复杂度的优越性能&#xff0c;占据着算法领域里举足轻重的地位。本篇内…