热门标签 | 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



推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
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社区 版权所有