【CF1053E】Euler tour
【CF1053E】Euler tour
题面
CF
洛谷
大概意思是你有一棵树,然而你并不知道这棵树是啥。给你一个确定了一些位置的欧拉序(就是\(ST\)表求\(LCA\)的那个序列),问你是否存在一个合法的序列,如果可以构造出一个。
题解
首先我们一定能够确定的是以下性质:
- \(a_1=a_{2n-1}\),因为首位肯定都是根节点
- 如果\(a_i=a_j\),那么两个位置中间的数的个数一定是偶数个,即\(i,j\)同奇偶。因为子树内每条边都会给序列贡献两个点,所以贡献的点数一定是偶数。
- 两个两侧端点是同一节点的区间如果有交,那么它们一定是包含关系。如果有交证明一个一定在另外一个子树内,所以必定是包含关系。
接下来考虑怎么构造,假设我们当前要构造的是区间\([l,r]\),首先这个区间要满足上面的性质。
然后从左往右扫一遍\([l,r]\),如果发现\(a_i=a_l\),证明\([lst,i]\)这段区间内是一棵子树,其中\(lst\)是\(a_i\)上一次出现的位置,那么可以递归处理这棵子树,处理完了之后可以直接删掉。
对于剩下的所有位置一定两两不成子树(如果成子树就会在前面被递归了),先统计一下总数和不同的节点数,看看空位置的数量够不够两两匹配,如果不够肯定不解。
首先空位置的数量一定要是确定的数字的两倍,那么首先从前往后填未出现过的数字把一部分空位置给填上。
然后如果连续三个位置形如\(0xy\),那么第一可以把它填成\(yxy\),如果连续三个位置形如\(xy0\),那么可以变成\(xyx\)。注意这里因为所有数字都只会出现一次,所以这样子才是对的。
这样子处理完只有一个三元组\(xyx\)只需要保留一个\(x\),于是这样子能够把所有\(0\)基本填满。
如果还有没有填满的位置,那么直接填上这段区间的根节点就行了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 1000100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
void Fail(){puts("no");exit(0);}
int n,m,a[MAX],pre[MAX],suf[MAX],vis[MAX],nxt[MAX];
void Del(int l,int r){suf[pre[l]]=suf[r];pre[suf[r]]=pre[l];}
int nw=1;
int get()
{
while(vis[nw])++nw;
if(nw>n)Fail();
vis[nw]=-1;return nw;
}
void Solve(int l,int r)
{
if((r-l)&1)Fail();
for(int i=l;i<=r;i=suf[i])
while(nxt[i])
{
if(nxt[i]>r)Fail();
Solve(suf[i],pre[nxt[i]]);
Del(suf[i],nxt[i]);
nxt[i]=nxt[nxt[i]];
}
int sum=0,cnt=0,rt=a[pre[l]];
for(int i=l;i<=r;i=suf[i])++sum,cnt+=a[i]>0;
sum=(sum+1)/2;if(cnt>sum)Fail();
for(int i=suf[l];i<=r;i=suf[i])if(!a[i]&&cnt<sum)a[i]=get(),++cnt;
if(sum==1&&cnt==0)a[l]=get();
for(int i=l;suf[i]<=r;i=suf[i])
{
while(i>l&&suf[i]<=r&&!a[pre[i]]&&a[i]&&a[suf[i]])
a[pre[i]]=a[suf[i]],Del(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(suf[i],suf[suf[i]]),i=pre[i];
}
for(int i=l;i<=r;i=suf[i])if(!a[i])a[i]=rt;
}
int main()
{
n=read();m=n+n-1;
for(int i=1;i<=m;++i)a[i]=read();
if(a[1]&&a[m]&&a[1]!=a[m])Fail();
a[1]=a[m]=a[1]|a[m];
for(int i=0;i<=m;++i)pre[i]=i-1,suf[i]=i+1;
for(int i=m;i;--i)if(a[i])nxt[i]=vis[a[i]],vis[a[i]]=i;
Solve(1,m);
puts("yes");for(int i=1;i<=m;++i)printf("%d ",a[i]);
puts("");return 0;
}
【CF1053E】Euler tour的更多相关文章
- 【BZOJ3060】[Poi2012]Tour de Byteotia 并查集
[BZOJ3060][Poi2012]Tour de Byteotia Description 给定一个n个点m条边的无向图,问最少删掉多少条边能使得编号小于等于k的点都不在环上. Input ...
- 【POJ】【1637】Sightseeing tour
网络流/最大流 愚人节快乐XD 这题是给一个混合图(既有有向边又有无向边),让你判断是否有欧拉回路…… 我们知道如果一个[连通]图中每个节点都满足[入度=出度]那么就一定有欧拉回路…… 那么每条边都可 ...
- 【SPOJ】【1825】Free Tour 2
点分治 点分治的例题2(本题代码结果为TLE……) 强烈谴责卡时限QAQ,T了无数次啊无数次…… 不过在N次的静态查错中倒是加深了对点分治的理解……也算因祸得福吧(自我安慰一下) TLE后的改进:每棵 ...
- jzoj3760. 【BJOI2014】Euler
题目大意: 欧拉函数 φ(n) 定义为不超过正整数 n 并且与 n 互素的整数的数目. 可以证明 φ(n) = n ∗ ∏ (1 − 1 / pi). 其中 pi(1 <= i <= ...
- [jzoj]3760.【BJOI2014】Euler
Link https://jzoj.net/senior/#main/show/3760 Description 欧拉函数 φ(n) 定义为不超过正整数 n 并且与 n 互素的整数的数目. 可以证 ...
- 【CF666B】World Tour(贪心,最短路)
题意:给你一张有向图,叫你给出四个点的序列a,b,c,d,使得这四个点依次间的最短路之和最大.(4 ≤ n ≤ 3000, 3 ≤ m ≤ 5000) 思路:O(n4)可用来对拍 我们需要O(n2)级 ...
- 【SPOJ1825】Free tour II (点分治,启发式)
题意: 边权可能为负 思路: 感觉我自己写的还是太过僵硬了,可以灵活一点,比如可以多写几个不同的dfs求出不同的信息,而不是压到同一个dfs里 #include<cstdio> #incl ...
- 【HDOJ6322】Euler Function(数论)
题意: 思路: #include <stdio.h> #include <vector> #include <algorithm> #include <str ...
- 【CF1137C】 Museums Tour 拆点+缩点
https://codeforc.es/contest/1137/problem/C # 题意 给你n个点,每个点有k天博物馆开放时间的安排表. 有m条单向道路,走过一条边需要一个晚上,经过后就是第二 ...
随机推荐
- SpringBoot源码学习系列之Locale自动配置
目录 1.spring.messages.cache-duration 2.LocaleResolver 的方法名必须为localeResolver 3.默认LocaleResolver 4.指定默认 ...
- Git终端命令行的常用操作
一.git源代码管理的优点 方便多人协同开发.工作 降低代码的管理成本 良好的分支管理机制 二.结构分析 服务端和客户端都有版本控制能力,都能进行代码的提交.合并 结构一: 结构二: 三.工作区的创建 ...
- rmi与rpc的区别
这里简单说一下RMI和RPC的区别. 什么是RMI RMI(Remote Method Invocation,远程方法调用),能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚 ...
- 【HNOI 2017】礼物
Problem Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个装饰物,并且每个装饰物 ...
- Selenium(七):选择框(radio框、checkbox框、select框)
1. 选择框 本章使用的html代码: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- 项目中使用http referer,为了盗取图片资源
项目背景:因为图片的数据是爬取的别人的图片,而且保存的数据仅仅是图片地址链接,为了减少数据存储和服务器压力,但是这就引发一个问题,有的图片地址没有做防盗处理,可以随意的下载使用:但有些图片的服务器做了 ...
- apache部分报错解决方法
AH00558: 进入apache文件夹下的conf文件夹,打开httpd.conf文件,用ctrl+F找到ServerName,如下图 在下面加上一句: ServerName domain_name ...
- IDEA org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
引用地址:https://guozh.net/idea-org-apache-ibatis-binding-bindingexception-invalid-bound-statement-not-f ...
- RHEL 6.6配置网易CentOS镜像的yum源小结
之前没有使用过网易CentOS镜像的yum源,最近由于需要,遂在一台测试服务器验证.测试了一下如何配置使用网易的Cent0S的yum源.此文仅仅是笔记性质,参考了网上大量资料(文末"参 ...
- 微信小程序之上传图片和图片预览
这几天一直负责做微信小程序这一块,也可以说是边做边学习吧,把自己做的微信小程序的一些功能分享出来,与大家探讨一下,相互学习相互进步. 先看下效果图 只写了一下效果样式的话希望大家不要太在意,下面马路杀 ...