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


先摆复杂度:均摊 \(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()

最新文章

  1. 源码阅读 etherum-transactions.py
  2. corefile 设置
  3. 【转】免费开源的FTP软件,FileZilla
  4. 认识JavaScript的原型
  5. wikioi 1154 能量项链
  6. DNF技能贴图的研究
  7. 『重构--改善既有代码的设计』读书笔记----Change Reference to Value
  8. Linux 安装 Redis 服务
  9. PAT (Advanced Level) 1049. Counting Ones (30)
  10. Selenium2+Python:Webdriver API速记手册
  11. Maven项目搭建(三):Maven直接部署项目
  12. P1279 字串距离 dp 洛谷
  13. zeromq学习记录(五)vc下多线程
  14. C++复习:异常
  15. Nginx缓存配置
  16. oracle中exists和in的比较
  17. 13 python 常用的内置方法介绍
  18. Python自动化之__unicode__
  19. android 图片二维码识别和保存(一)
  20. 19. Remove Nth Node From End of List(移除倒数第N的结点, 快慢指针)

热门文章

  1. python虚拟环境解决不能执行脚本的问题
  2. 前端 ArrayBuffer 与 Blob 互转
  3. golang for 循环
  4. PGSQL新建临时表
  5. 使用.Net工具安装某种程序
  6. python_异常处理(try except)
  7. 【DM论文阅读杂记】复杂社区网络
  8. SQL数学函数学习
  9. 个人css样式_2: 渐变色
  10. Django初识(一)