Codeforces Round #452 (Div. 2) - E. Segments Removal(链表+优先队列)

【异常】解决JDK21升级中的SecurityException: JCE无法验证BC提供者问题 本文详细解析了JDK21升级中常见的SecurityException: JCE无法验证BC提供者问题的根源与解决方案。核心在于JDK21强化了JCE安全验证,导致签名不合规的老版本Bouncy Castle库被拒绝。文章提供了通过Maven依赖树精准定位、排除旧版本并引入兼容的bcprov-jdk18on新库的完整步骤,以及清理缓存等实战技巧,帮助开发者彻底解决此兼容性问题。 阅读详情

E. Segments Removal
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Vasya has an array of integers of length n.

Vasya performs the following operations on the array: on each step he finds the longest segment of consecutive equal integers (the leftmost, if there are several such segments) and removes it. For example, if Vasya's array is [13, 13, 7, 7, 7, 2, 2, 2], then after one operation it becomes [13, 13, 2, 2, 2].

Compute the number of operations Vasya should make until the array becomes empty, i.e. Vasya removes all elements from it.

Input

The first line contains a single integer n (1 ≤ n ≤ 200 000) — the length of the array.

The second line contains a sequence a1, a2, ..., an (1 ≤ ai ≤ 109) — Vasya's array.

Output

Print the number of operations Vasya should make to remove all elements from the array.

Examples
input
4
2 5 5 2
output
2
input
5
6 3 4 1 5
output
5
input
8
4 4 4 2 2 100 100 100
output
3
input
6
10 10 50 10 50 50
output
4
Note

In the first example, at first Vasya removes two fives at the second and third positions. The array becomes [2, 2]. In the second operation Vasya removes two twos at the first and second positions. After that the array becomes empty.

In the second example Vasya has to perform five operations to make the array empty. In each of them he removes the first element from the array.

In the third example Vasya needs three operations. In the first operation he removes all integers 4, in the second — all integers 100, in the third — all integers 2.

In the fourth example in the first operation Vasya removes the first two integers 10. After that the array becomes [50, 10, 50, 50]. Then in the second operation Vasya removes the two rightmost integers 50, so that the array becomes [50, 10]. In the third operation he removes the remaining 50, and the array becomes [10] after that. In the last, fourth operation he removes the only remaining 10. The array is empty after that.


题意:

每次找连续最长的序列(相等取左),并把它去掉。输出要做几次操作,变成空


POINT:

把每个连续的序列分号。从1 2 3标号。然后用链表连接。

全部放在优先队列里。

把最大的去掉之后。连接他的左边和右边。

判断他们能不能合并,可以的话,把他们从链表里删除,连接一个新值即他们两个的和,且他的l为左边的l。

给每个序列flag记录有么有被删了,被删了就不用ans++了。




#include <iostream>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <algorithm>
using namespace std;
#define  LL long long
const int maxn = 500000+444;

int flag[maxn],a[maxn];
int num[maxn],pre[maxn],nxt[maxn];
struct node
{
	int id,l;
	int kind;
	bool operator < (const node &a) const{
		if(num[id]==num[a.id]){
			return l>a.l;
		}
		return num[id]<num[a.id];
	}
}b[maxn];

int cnt=0;

int main()
{
	priority_queue<node> q;
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	int x=0;
	a[n+1]=-1;
	for(int i=1;i<=n;i++){
		x++;
		if(a[i]!=a[i+1]){
			++cnt;
			b[cnt].id=cnt;
			b[cnt].kind=a[i];
			num[cnt]=x;
			x=0;
		}
	}
	for(int i=1;i<=cnt;i++){
		b[i].l=i;
		pre[i]=i-1;
		nxt[i]=i+1;
		q.push(b[i]);
	}
	nxt[cnt]=0;
	int ans=0;
	while(!q.empty()){
		node now=q.top();
		q.pop();
		if(flag[now.id]) continue;
		ans++;
		int p=pre[now.id];
		int nt=nxt[now.id];
		if(p==0||nt==0||b[p].kind!=b[nt].kind){
			nxt[p]=nt;
			pre[nt]=p;
			continue;
		}
		++cnt;
		flag[p]=flag[nt]=1;
		b[cnt].id=cnt;
		b[cnt].kind=b[p].kind;
		b[cnt].l=b[p].l;
		num[cnt]=num[p]+num[nt];
		q.push(b[cnt]);
		nxt[pre[p]]=cnt;
		pre[nxt[nt]]=cnt;
		nxt[cnt]=nxt[nt];
		pre[cnt]=pre[p];

	}
	printf("%d\n",ans);


	return 0;
}


数学建模学习(78):多输入多输出回归预测模型(结合XGBoost实现) 多输入多输出回归预测问题求解 阅读详情

相关推荐

2023 年全国网络安全行业职业技能大赛-电子数据取证分析师-决赛WP_2023网络安全行业赛取证

数据库取证工具里面可以恢复删除掉的数据带红叉的就说删除过的,game库下面announcement_detail表里面update_time字段使用sql语句时间戳最大为1513243355转换时间为2017-12-14 17:22:35。

2401_89791684的博客 2090

E. Segments Removal(优先队列&set)

E. Segments Removal(优先队列&set) 本题可用优先队列模拟,用pairpairpair储存每段长度和编号,然后开两个数组next[],pre[]next[],pre[]next[],pre[]用来合并操作。至于合并后之前的两个已经被删除的段怎么处理,考虑用setsetset标记是否访问即可,或者也可以再开一个优先队列维护。 两pq+链表 // Problem: E. Segments Removal // Contest: Codeforces - Codeforces Rou

Harris-H的博客 538

PIV实验流场流速云图(MALAB contour函数用法)

clear;clc; for k=1:5 str1=['filename1']; str2=['filename2']; str3=['filename3']; str=eval(['str',num2str(k)]); load(str); [m n]=size(y); y=flipud(y); v=-v; x=x-x(1,...

Nick_Cui的博客 3222

CodeForces - 452E Three strings

题意: 给定三个字符串 s1,s2,s3s_1, s_2, s_3s1​,s2​,s3​,问对每个 l(l≤min⁡{∣s1∣,∣s2∣,∣s3∣})l(l \leq \min\{|s_1|, |s_2|, |s_3|\})l(l≤min{∣s1​∣,∣s2​∣,∣s3​∣}),有多少个三元组 (i1,i2,i3)(i_1, i_2, i_3)(i1​,i2​,i3​) 满足 sk[ik,⋯ ,i...

weixin_44059127的博客 197

AI系统架构设计实战:AI应用架构师的深度指南

核心概念:AI系统架构是指设计和组织人工智能系统各个组件(包括数据、算法、计算资源、集成接口等)的结构框架,以及这些组件之间的交互方式和原则。它为AI应用提供了技术蓝图,决定了系统的性能、可扩展性、可维护性和可靠性。数据的本质:数据是对客观事物的符号表示,是可识别的、抽象的符号。在AI系统中,数据不仅是输入,也是系统学习和改进的基础。数据就像AI系统的"燃料",其质量和数量直接决定了AI系统的能力边界。

AI天才研究院 1197

CST 2023安装避坑指南:从下载到破解的完整流程(附常见报错解决方案)

本文提供CST 2023三维全波电磁场仿真软件的完整安装指南,涵盖从下载到破解的全流程,并附常见报错解决方案。详细解析安装步骤、许可证配置优化及高频问题诊断,帮助用户快速部署并优化软件性能,适用于射频电路设计、天线优化等场景。

7z8x2c4v6b9的博客 656

CodeForces Problem - Segments Removal

CodeForces Problem - Segments Removal 原题地址 题目类型:链表、Set 题意 给定一个整数序列,每次选择元素相同的最长的连续的子串然后删除,删除后左右两边的部分会拼接起来,如果有多个这样的子串则选择最左边的。求按照如上规则多少次操作后源串会变为空串。 分析 首先将连续的子串处理为 num 和 cnt 表示,然后用静态链表存储,并用 TreeSet 保存,使得 set 最后一个元素为长度最长且是最左边得子串。然后模拟执行上面得操作,每次删除一个子串后将其链表中左右两边得节

w_weirdo的博客 160

ADS学习笔记 1. 功率放大器设计

基于ADS2023 update2的学习笔记1.功率放大器设计

u014087103的博客 1万+

Codeforces 452E Three strings 后缀数组 + 并查集

题目大意: 就是现在给出三个总长度不超过3*10^5的字符串, 每个字符串只包含字母'a' ~ 'z', 现在对于每一个L, (1 大致思路: 首先不难想到后缀数组处理三个串拼接起来的总串, 记录每一个字符的来源, 也就是记录每个后缀的来源, 然后需要根据height数组从大到小来利用并查集标记区间进行计算, 注意两个区间合并的时候之后 (i, j, k)三者不来自同一个原来的区间

Gatevin的专栏 1158

基于 YOLOv26 的校园安全监控系统:多场景应用

本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。

一键难忘的博客 501

PCL 计算点云包围球【2025最新版】

包围球通常用于简单排斥,因为与球体相交的方程很简单,同样重要的是,旋转一个球体并不会改变其范围。因此,当包围球用于简单排斥时,如果球体中心是对象的原点,则可以忽略对象的方向。

点云侠的博客 2068

Codeforces - E. Segments Removal

题目链接:E. Segments Removal 题意:给你一个长为n的序列,每次对当前序列进行一次操作,就是将当前序列中最长的一段各元素相等的子段删掉,若满足题意的最长子段不止一条,则删最左边的,问你将该序列删完要操作多少次? 看到这种删除,合并的操作,我们可以想到并查集或者set来做是很方便的。 然后我们就要去想怎么去用set维护。 我们开两个set,一个存,块的长度和编号,另一个存块的编号...

青烟绕指柔的博客 486

基于YOLOv8深度学习架构的智能农业巡检小车系统—面向农作物与杂草实时精准识别的创新实践

本研究设计并实现了一套基于YOLOv8的智能农业巡检小车系统,解决农田中农作物与杂草的精准识别与追踪问题。系统采用改进YOLOv8-RGCSPELAN-ECA-AFPN模型,融合ECA注意力机制与AFPN多尺度特征融合结构,提升复杂环境下的检测精度。硬件以树莓派4B为核心,集成摄像头、传感器与电机模块,具备避障、循迹与自主导航功能。移动端基于Android部署NCNN推理引擎,实现模型高效移植与实时检测。

Stara-AI的博客 1423

Codeforces899E Segments Removal

标签:STL,数据结构题目题目传送门Vasya has an array of integers of length n.Vasya performs the following operations on the array: on each step he finds the longest segment of consecutive equal integers (the leftmost,

Welcome to yjjr's blog! 907

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

CodeForces 899E Segments Removal

题解: 这题解法比较多样,核心思路都是模拟,只是实现的方法不一样。我的话是采用并查集+堆来维护。并查集要维护三个值:这一团的数字个数,这一团最左边的数字,这一团最右边的数字(这些都是可以直接暴力合并的),然后用堆来维护最大的区间,每次取出来判断一下是否已经被删去,没有就计入答案然后更新并查集和堆就可以了。 代码如下: #include&lt;bits/stdc++.h&gt; #defin...

temp06的博客 232

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Codeforces 452 E. Segments Removal

题目链接简介: 给出一个正整数序列,每次选择删除数字相同的一个连续区间(如果有多个就选择最靠左的),询问需要几次删除操作才能使序列为空分析: ZYXZYXZYX和澍神做的题,说是练数据结构,于是就做做看啦看到题目,第一个反应:unique?set? 但是我的STL好似是废掉的。。。那就用平衡树搞 我们可以采用缩点的方法,把一个区间缩成一个点,扔进splay中在每个维点中多维护一个信息mx:该

Coco_T的博客 371

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

CF 899E Segments Removal 链表+优先队列

题意:长度为n的序列a,操作:每次移除序列中,元素都相等并且长度最长的一段区间.(若有多个 移除最左边一个). n 相同的合并成一个二元组(xi,ci)  xi为数字,ci为xi的出现次数. .整个二元组序列用链表串起来. 每次删除链表中c[i]最大的位置, n次,每次查询链表中最大值并且要跳的最大值所在位置 O(n^2) TLE... 将链表所有节点压入优先队列中,对于合并时被删

noone0的博客 375

Codeforces 452E 后缀数组 + 并查集

题意 传送门 Codeforces 452E. Three strings 题解 将子串看做后缀的前缀,那么使用两个互不相同且非小写字母的字符将 333 个字符串拼接起来,求解后缀数组以及高度数组。由于后缀数组的有序性,故最长相同前缀不小于某个长度 hhh 的后缀集合在后缀数组中处于连续的位置,且对应位置的高度数组的值不小于 hhh。 那么可以使用并查集维护这样连续的位置,从高度数组的最大值(333 个字符串的最长长度)开始处理,使用相邻 sa[i],sa[i+1]sa[i],sa[i+1]sa[i],sa

neweryyy的博客 249

Segments Removal CodeForces - 899E

题意:每次删除最长的一段,问最少多少次删完 思路:双链表模拟 #include<bits/stdc++.h> using namespace std; const int N=2e5+5; int a[N],val[N],pre[N],nxt[N],sum[N],ans,tot; bool vis[N]; int main(){ int n; scanf("%d"...

skyline的分享专栏 231

codeforces 452E. Three strings 后缀数组

题意:给三个串s1,s2,s3,对于每个长度L(1<=L<=min(length(s1,s2,s3)))求有多少个三元组<p1,p2,p3>使得s1[p1...p1+L-1]==s2[p2..p2+L-1]==s3[p3..p3+L-1],求出所有L对应的答案对1e9+7取模。 题解: 先把串连在一起,记录每个位置所属的串,跑一下后缀数组求出height数组。 如果从...

qq_39898877的博客 327

[Codeforces 452E] Three Strings

[题目链接] https://codeforces.com/contest/452/problem/E [算法] 构建后缀数组 用并查集合并答案即可 时间复杂度 : O(NlogN) [代码] #include<bits/stdc++.h> using namesp...

215

【CodeForces452E】Three strings

【题目链接】点击打开链接【思路要点】建立多串后缀树,每个节点对答案数组的贡献可以描述为一次区间加操作,差分+前缀和即可。时间复杂度\(O(\sum|S|)\)。【代码】#include&lt;bits/stdc++.h&gt; using namespace std; const int MAXN = 300005; const int P = 1e9 + 7; template &lt;type...

cz_xuyixuan的博客 468

codeforces 899e Segments Removal

Vasya has an array of integers of length n.Vasya performs the following operations on the array: on each step he finds the longest segment of consecutive equal integers (the leftmost, if there are seve

blue_kid的博客 618

[Codeforces452E]Three strings(后缀自动机)

话说ATP这个周末竟然没打游戏

ADP+Pi==ATP 693

codeforces 452E Three strings 后缀数组+并查集

给三个串s1,s2,s3,对于meig

Broken Wings 978

Codeforces Round #452 (Div. 2) E. Segments Removal(并查集 + 优先队列)

题目链接:http://codeforces.com/contest/899/problem/E; 题目大意:给你一个长度为 n 的数组,每次操作只能消去数组中最长连续的数,问消去整个数组需要操作几次。 题目思路:一开始是想用线段树维护,但是由于太鶸了维护不动。。。后来想着用并查集维护每个连续数集合的左端点和右端点,再用优先队列来找最长的集合,经历了无数次的WA,TLE,MLE(虽然至今不知道

Lee_w_j__的博客 296
上一篇: Codeforces Round #452 (Div. 2) - D. Shovel Sale (规律)
下一篇: AtCoder Beginner Contest 082 - D - FT Robot (set||DP)
Mr_Treeeee
博客等级 码龄10年 38粉丝 551原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值