初中同学问我咋做,所以就写了一份题解。


先摆复杂度:均摊 \(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的更多相关文章

随机推荐

  1. Echarts 圆形立体柱状图

    先放个效果图 const resData = [ { label: "上海", value: 66 }, { label: "北京", value: 26 }, ...

  2. 四点DLT (Direct Linear Transformation) 算法

    \(\mathrm{x}_{i}\) 表示变化前的齐次坐标 \(\mathbf{x}_{i}^{\prime}\) 表示变化后的齐次坐标 我们需要求到一个 \(3\times3\) 的变换矩阵 \(\ ...

  3. 关于tensor2tensor与tensorflow版本冲突的解决方案

    工作需要,研究了几天的t2t,万万没想到在虚拟环境的搭建方面出现了问题. 直接安装t2t,当前是1.15.7版本,默认会安装tensorflow的最新版本,最终会在执行t2t-trainer命令的时候 ...

  4. 生成数据库文档 —— Spring Boot + Screw

    1.创建一个SpringBoot项目(本人使用的是IntelliJ IDEA 2020.1 x64) 最佳简单的项目配置如下: 2.添加相关依赖 <!--screw依赖--> <de ...

  5. apollo兼容mysql的时候报错Table 'apolloportaldb.hibernate_sequence' doesn't exist

    解决方案: 配置文件里加: spring.jpa.properties.hibernate.hbm2ddl.auto=update

  6. 【C++】【纯代码】获取电脑的mac地址

    bool GetMacAddress(CString &LanMAC) { #define MAX_ADAPTER_NAME_LENGTH 256 #define MAX_ADAPTER_DE ...

  7. 至少有K个重复字符的最长子串

    传送门 /** * 分治 */ class Solution { // dp[i]:表示以i为结尾满足条件的子串的长度 public int longestSubstring(String s, in ...

  8. lua如何转化为exe

    在这里下载    https://wwn.lanzout.com/iIS9d07rpesh 然后用cmd到 下载的盘:\luapack\luapack\bin\Debug 然后glue.exe srl ...

  9. vue整体回顾

    vue大回顾 1 前端发展史 react vue---> 前端工程化---> 前后端分离 大前端:flutter uni-app 2 Vue介绍 单页面应用(spa) 组件化开发 mvvm ...

  10. (四)用go实现红黑树

    本篇文章我们用go来实现红黑树,部分参考资料如下: https://www.cnblogs.com/skywang12345/p/3245399.html#!comments https://blog ...