题意

给出一个某些位置不全的欧拉序,求出一个符合条件的,或输出不行

传送门

\(n \le 5*10^5\)

思路

终于不是一道神仙\(dp\)

变成了一道神仙构造

以下简称两相同数围成的是一个区间,基本性质:

  1. 两个相同数之间的长度为奇数
  2. 头尾一定相同
  3. 区间要么完全包含要么不相交
  4. 某段区间内已确定的落单的数一定小于区间\(0\)的个数\(+1\),因为一个落单的数除了叶子总得再配一个
  5. 对任意一棵大小为\(x\)的子树,序列长度为\(2x-1\)

首先区间不相交就让我们可以分治搞下去,先递归到最小的区间处理,然后处理完此区间对答案就没有影响了,可以直接删掉(浓缩成一个根节点代替整个子树),具体就是维护一下前驱和后继循环时一段一段跳就好了。

接着要考虑最小的区间怎么办了。考虑一下填完后确定的数一定是\(\lfloor \frac{区间长度+1}2 \rfloor\),那么首先从前往后在多出来的空格填未出现过的数字。

接着就开始了,形如\(120\)或\(021\)的,只要填成\(121\),也就是我们要不停的找如\(xy0\)或\(0xy\)的某三个数,并且填完后把它们当做只有\(2\)也就是父亲节点就好了。

如果还有是没填的怎么办呢?发现当前区间的父亲可以用来分割两个区间。

例如填完后变成了\(1[20304]1\)括号表示当前区间,无法用前面的方法再来填,那就可以用\(1\)来填补剩下的空格变为\(1213141\)

#include <bits/stdc++.h>
using std::deque;
const int N=1000100;
int suf[N],pre[N],Next[N],last[N],c[N],a[N],n,m,now;
struct note{
int x,p;
};
deque <note> q;
void endd(){
puts("no");
exit(0);
}
void del(int x,int y){
suf[x]=suf[y];
pre[suf[y]]=x;
}
int get(){
while (c[now]) now++;
if (now>n) endd();
c[now]=1;
return now;
}
void solve(int l,int r){
if (r<l) return;
if ((r-l)&1) endd();
for (int i=l;i<=r;i=suf[i]){
if (!a[i]) continue;
while (Next[i]){
int to=Next[i];
if (to>r) endd();
solve(suf[i],pre[to]);
del(i,to);
Next[i]=Next[to];
}
}
int sum=0,sum0=0;
for (int i=l;i<=r;i=suf[i]){
sum+=(a[i]>0);
sum0+=(!a[i]);
}
if (sum0<sum-1) endd();
for (int i=l;i<=r && sum0>sum;i=suf[i])
if (!a[i]) a[i]=get(),sum0--,sum++;
int rt=a[pre[l]];
for (int i=l;suf[i]<=r;i=suf[i]){
while (i>l && suf[i]<=r && a[i] && a[suf[i]] && (!a[pre[i]])){
a[pre[i]]=a[suf[i]];
del(pre[i],suf[i]);
i=pre[pre[i]];
}
while (i>=l && suf[suf[i]]<=r && a[i] && a[suf[i]] && (!a[suf[suf[i]]])){
a[suf[suf[i]]]=a[i];
del(i,suf[suf[i]]);
i=pre[i];
}
}
for (int i=l;i<=r;i=suf[i])
if (!a[i]) a[i]=rt;
}
int main(){
scanf("%d",&n);
m=2*n-1;
for (int i=1;i<=m;i++) scanf("%d",&a[i]),c[a[i]]++;
if (a[1]!=a[2*n-1] && a[1] && a[2*n-1]) endd();
a[1]=a[m]=(a[1]|a[m]);
for (int i=m;i>=1;i--)
Next[i]=last[a[i]],last[a[i]]=i;
now=1;
suf[0]=1;
for (int i=1;i<=m;i++) pre[i]=i-1,suf[i]=i+1;
solve(1,m);
puts("yes");
for (int i=1;i<=m;i++) printf("%d ",a[i]);
}

后记

神仙啊,其实我还是不怎么懂

CF1053E Euler tour的更多相关文章

  1. CF1053E Euler tour 构造

    正解:构造 解题报告: 传送门! 这种题目一般都是首先考虑合法性 这题也不例外,思考怎么样是合法的呢? 有四点: 1)a[1]=a[2n-1],显然不说 2)若a[i]=a[j],则(j-i)& ...

  2. 【CF1053E】Euler tour

    [CF1053E]Euler tour 题面 CF 洛谷 大概意思是你有一棵树,然而你并不知道这棵树是啥.给你一个确定了一些位置的欧拉序(就是\(ST\)表求\(LCA\)的那个序列),问你是否存在一 ...

  3. Euler Tour Tree与dynamic connectivity

    Euler Tour Tree最大的优点就是可以方便的维护子树信息,这点LCT是做不到的.为什么要维护子树信息呢..?我们可以用来做fully dynamic connectivity(online) ...

  4. 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)

    传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...

  5. poj1637--Sightseeing tour(最大流)

    最大流求混合图是否存在欧拉回路. 以下内容摘自http://www.cnblogs.com/Missa/archive/2012/12/05/2803107.html 讲的很清楚. 混合图的欧拉回路问 ...

  6. uva10735 Euler Circuit

    题外话:很多混合图问题可以转化为有向图问题(将无向边拆为两条有向边) 本题不行,因为只能经过一次 这种问题能想到网络流.. 复习欧拉回路:入度==出度 和uva1380有点相似,要先给无向边定向.原图 ...

  7. Range Minimum Query and Lowest Common Ancestor

    作者:danielp 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAnc ...

  8. GDKOI2015 Day1

    P1 题目描述: 判断一个环形字符串(或者减去一个字符之后)是否是回文串 solution: 1.hash 将字符串的前缀进行hash,然后将字符串翻转,再做一次hash,然后枚举对称轴,判断两边的h ...

  9. 混合欧拉回路的判断(Dinic)

    POJ1637 Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7483   Accepte ...

随机推荐

  1. 结对编程作业(python实现)

    一.Github项目地址:https://github.com/asswecanfat/git_place/tree/master/oper_make 二.PSP2.1表格: PSP2.1 Perso ...

  2. javascript 给事件任务一个缓冲区

    在编写前端的过程中,经常会监听事件并执行任务,我在这抛出2个比较常见的场景: 1.输入关键字搜索如果你监听input的chage事件,会有一个问题,在使用中文输入法时,你输入的几个拼音字母都会被触发我 ...

  3. skeleton directory: /etc/skel

    第一次接触这个词汇 还是在LFS8.2里面,感觉有点吓人.好好一个计算机操作系统,怎么搞出这个恐怖的术语.... 当使用useradd 或者其他命令创建用户的时候,/etc/skel这个目录下的文件. ...

  4. arduino安装出现驱动程序不适用于该平台

    之前重新安装了系统,然后重新安装arduino驱动的时候出现了之前没遇到过的问题,这里记录一下. 现在装的是win7 64位的系统,先去官方下载(官方下载慢的,可以去相关论坛下载),有安装版和解压版的 ...

  5. 14.Vue组件

    1.定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不 ...

  6. webSocket的场景应用

    应用场景 服务器更新 前端页面也进行局部刷新,更新服务器端返回的信息 什么是webSocket? 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对 ...

  7. #Python语言程序设计Demo - 七段数码管绘制

    Python设计七段数码管绘制 单个数码管效果: 设计总数码管效果: Pyhton 编程: #七段数码管绘制 import turtle as t import time as T def drawG ...

  8. 前端笔记-html

    前端笔记html 前端三大利器,html(本源),css(着装),js(动作) html 学习html就是学习一套规则能够被浏览器识别,在页面中展示,一个页面只能运行一个html 标签 <> ...

  9. 1115 JAVAScript基础

    目录 JavaScript 1.基础 1.1 注释 1.2 引入方式 2. 变量 2.1 变量声明 2.2 变量的命名规范 3.常量 4. 数据类型 4.1 数值型 Number 4.2 字符串型 S ...

  10. Elasticsearch: nested对象

    在处理大量数据时,关系数据库存在很多问题. 无论是速度,高效处理,有效并行化,可扩展性还是成本,当数据量开始增长时,关系数据库都会失败.该关系数据库的另一个挑战是必须预先定义关系和模式.Elastic ...