Luogu7912
初中同学问我咋做,所以就写了一份题解。
先摆复杂度:均摊 \(O(n)\)。
考虑,如果我们每次操作的复杂度都与输出量同阶,而输出量总量 \(O(n)\),则复杂度得到均摊。
于是我们现在要设计一个算法,满足每步复杂度与输出量同阶。
考虑暴力维护当前的每个颜色段开头元素,以及在当前总序列中每个元素的前驱、后继。
这个通过一个链表即可实现。
容易分析出每步复杂度与输出量同阶。
于是本题解完。
以下是参考代码(常数很大,已经过卡常):
import io
import os
import sys
input = io.BytesIO(os.read(0, os.fstat(0).st_size)).readline
a=[]
b=0
def readInt():
    global input
    global a
    global b
    if len(a)<=b:
        a=list(map(int,input().split()));b=0
    ans=a[b];b+=1
    return ans
n=readInt();S=[];now=[];nxt=[];pre=[];done=[]
for i in range(n):
    S.append(readInt());now.append(i);nxt.append(i+1);pre.append(i-1);done.append(False)
def Merge():
    global S
    global now
    global done
    x=[]
    m=len(now)
    for i in range(m):
        if not done[now[i]] and (not len(x) or S[x[-1]] != S[now[i]]):
            x.append(now[i])
    now=x
def Pop():
    global S
    global now
    global nxt
    global pre
    global done
    m=len(now)
    if m:
        for i in range(m-1):
            sys.stdout.write(str(now[i]+1)+' ')
    sys.stdout.write(str(now[-1]+1)+'\n')
    x=[]
    for i in range(m):
        p=now[i]
        done[p]=True
        if pre[p] != -1:
            nxt[pre[p]]=nxt[p]
        if nxt[p] != n:
            pre[nxt[p]]=pre[p]
            if S[nxt[p]] == S[p] and (not len(x) or S[x[-1]] != S[now[i]]):
                x.append(nxt[p])
    now=x
Merge()
while len(now):
    Pop()
Luogu7912的更多相关文章
随机推荐
- 四大组件之服务Service
			参考:Android开发基础之服务Service 什么是服务呢? 用俗话话应该是长期于后台运行的程序,如果是官方一点,首先它是一个组件,用于执行长期运行的任务,并且与用户没有交互. 每一个服务都需要在 ... 
- 对称加密、非对称加密 与 HTTPS
			一.对称加密(Symmetric Cryptography)对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). ... 
- 获取select的选中的值
			var select = document.getElementById("sec")//获取元素 var idx = select.selectedIndex;//获取当前选中的 ... 
- Java Development Kit下载地址
			Java Development Kit下载地址 官网下载 一般最新版本无需登录即可下载,其他历史版本需要登录Oracle账户才可以下载. 最新版下载地址: https://www.oracle.co ... 
- Angular响应式表单验证输入(跨字段验证、异步API验证)
			一.跨字段验证 1.新增验证器 import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms'; exp ... 
- hyper给linux扩容空间
			1.hyper操作 (1)关机后,在设置中,查看硬盘驱动器中的虚拟磁盘及编号, (2)编辑磁盘->查找磁盘中选中刚才的编号磁盘 (3)操作时扩容(大小填的不是增量 ,是扩容以后的空间) 2.li ... 
- WPF datagrid双击一整行而不是选中单元格
			WPF开发一个工具 需要双击datagrid的某一行显示详细数据并编辑,之前双击行(DatagridRow)每次都跳转到单元格上(DatagridCell) 经验证,需要修改datagrid样式的某几 ... 
- vue2中底层响应式数据实现
			<input type="text" id="textInput" />输入:<span id="textSpan"> ... 
- DPU02是一个高度集成的USB转UART的桥接控制器
			DPU02是一个高度集成的USB转UART的桥接控制器,该产品提供了一个简单的解决方案,可将RS-232设计更新为USB设计,并简化PCB组件空间.该DPU02包括了一个USB 2.0全速功能控制器. ... 
- Raid磁盘阵列更换磁盘时另一块盘离线恢复案例(v7000存储数据恢复)
			Raid磁盘阵列更换磁盘时另一块盘离线恢复案例(v7000存储数据恢复) [故障描述]客户设备型号为IBM V7000存储,架构为AIX+oracle+V7000存储阵列柜,需要恢复的数据主要存放在阵 ... 
