热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【CodeForces】899E.SegmentsRemoval

【题目】E.SegmentsRemoval【题意】给定n个数字,每次操作删除最长的连续相同数字(等长删最左),求全部删完的最

【题目】E. Segments Removal

【题意】给定n个数字&#xff0c;每次操作删除最长的连续相同数字&#xff08;等长删最左&#xff09;&#xff0c;求全部删完的最少次数。n<&#61;2*10^6&#xff0c;1<&#61;ai<&#61;10^9。

【算法】并查集&#43;堆

【题解】将序列的相同数字段压缩&#xff0c;全部插入堆。那么每次操作删除堆顶&#xff0c;并尝试合并堆顶的前驱和后继&#xff0c;能合并就重新插入堆中。

在支持删除的序列中找前驱和后继&#xff0c;是经典的并查集实现。

具体而言&#xff0c;fa[i]表示 i 点左边&#xff08;含自身&#xff09;最近的未被删除的点&#xff0c;即把删除了的点全部并入左侧第一个未被删除的点&#xff0c;那么删除点x后fa[x]&#61;find(fa[x]-1)。

前驱是find(fa[x]-1)&#xff0c;后继只需要记录r[x]表示x点代表区间的最右端点&#xff0c;每次合并是&#xff1a;fa[y]&#61;x,r[x]&#61;r[y]。

如果能合并就重新插入堆中&#xff0c;容易发现堆中废弃的元素一定比新插入的更晚访问&#xff0c;所以废弃元素访问到就会是被删除的现象&#xff0c;一个元素被删除表现为find(x) ≠ x。

注意&#xff1a;删除的时候记得更新r[]。

#include
#include

#include

#include

#include

#include

#include
<set>
#include

#include

#define ll long long
#define lowbit(x) x&-x
using namespace std;
int read(){char c;int s&#61;0,t&#61;1;while(!isdigit(c&#61;getchar()))if(c&#61;&#61;&#39;-&#39;)t&#61;-1;do{s&#61;s*10&#43;c-&#39;0&#39;;}while(isdigit(c&#61;getchar()));return s*t;
}
int min(int a,int b){return aa:b;}
int max(int a,int b){return ab:a;}
int ab(int x){return x>0?x:-x;}
//int MO(int x){return x>&#61;MOD?x-MOD:x;}
//void insert(int u,int v){tot&#43;&#43;;e[tot].v&#61;v;e[tot].from&#61;first[u];first[u]&#61;tot;}
/*
------------------------------------------------------------*/
const int inf&#61;0x3f3f3f3f,maxn&#61;200010;int n,fa[maxn],a[maxn],tot,r[maxn];
struct cyc{int id,ans,number,l;bool operator <(const cyc &a)const{return ansa.l);}
}b[maxn];
priority_queue
q;
int find(int x){return fa[x]&#61;&#61;x?x:fa[x]&#61;find(fa[x]);}
int main(){n&#61;read();int x&#61;0;for(int i&#61;1;i<&#61;n;i&#43;&#43;)a[i]&#61;read();for(int i&#61;1;i<&#61;n;i&#43;&#43;){x&#43;&#43;;if(a[i]!&#61;a[i&#43;1]){b[&#43;&#43;tot]&#61;(cyc){tot,x,a[i],i};x&#61;0;}}n&#61;tot;for(int i&#61;1;i<&#61;n;i&#43;&#43;)fa[i]&#61;i,r[i]&#61;i;for(int i&#61;1;i<&#61;n;i&#43;&#43;)q.push(b[i]);for(int i&#61;1;i<&#61;n;i&#43;&#43;){cyc x&#61;q.top();q.pop();while(find(x.id)!&#61;x.id&&!q.empty())x&#61;q.top(),q.pop();if(q.empty()){if(find(x.id)!&#61;x.id)printf("%d",i-1);else printf("%d",i);return 0;}//printf("%d %d %d %d\n",x.id,x.ans,x.number,x.l);int f&#61;find(x.id);fa[f]&#61;find(f-1);r[fa[f]]&#61;r[f];int pre&#61;find(f-1),suc&#61;find(r[f]&#43;1);if(pre&#61;&#61;0||suc&#61;&#61;0||b[pre].number!&#61;b[suc].number)continue;fa[suc]&#61;pre;b[pre].ans&#43;&#61;b[suc].ans;r[pre]&#61;r[suc];q.push(b[pre]);}return 0;
}

View Code

 

转:https://www.cnblogs.com/onioncyc/p/8057271.html



推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本题探讨了在一个有向图中,如何根据特定规则将城市划分为若干个区域,使得每个区域内的城市之间能够相互到达,并且划分的区域数量最少。题目提供了时间限制和内存限制,要求在给定的城市和道路信息下,计算出最少需要划分的区域数量。 ... [详细]
author-avatar
Reaki是睿睿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有