和bzoj4059: [Cerc2012]Non-boring sequences非常相似

Description

一棵Factor-Free Tree是指一棵有根二叉树,每个点包含一个正整数权值,且每个点的权值都与其所有祖先的权值互质。
二叉树中序遍历是指按照左子树-根-右子树的顺序递归遍历二叉树,将每个点的权值依次写下来得到的序列。
给定一个序列a_1,a_2,...,a_n,请判断它是不是可能是某棵Factor-Free Tree的中序遍历序列,如果是的话请给出例子。

Input

第一行包含一个正整数n(1<=n<=1000000)。
第二行包含n个正整数a_1,a_2,...,a_n(1<=a_i<=10^7),表示节点编号为1到n的每个点的权值。

Output

若不是,输出impossible
否则输出一行n个整数,依次表示序列每一项代表的节点在树中的父亲节点,若是根节点则输出0。
若有多组解,输出任意一组。

题目分析

暴力做法就是在$[l,r]$内找到一个$rt$满足$\forall (a[rt],a[i])=1 \, rt≠i$,并递归做下去。这样复杂度是$O(n^3)$的。

考虑如何利用重复信息。互质看上去不好处理,但其实不过是一种二元关系而已。那么固定一个量,即处理出对于$a_i$,与其互质的数的最大区间$[l,r]$。

转成这一步,就可以用bz4059的“启发式拆分”方法去做了。

总结一下:“启发式拆分”这种方法适用于一类可拆分的连续的区间问题。“可拆分”是指只需要在区间内寻找一个断点,并且拆分之后就不会再次合并;“连续”意味着对于固定的$i$,它所能影响到的区间是连续的,即非法之后不会再次合法。

不要忘记左右横跳。

 #include<bits/stdc++.h>
#define REG register int
const int maxn = ;
const int maxNum = ; int n,mx,a[maxn],fa[maxn];
int pr[maxn],res[maxNum],pre[maxn],nxt[maxn],lst[maxNum];
std::bitset<maxNum> vis; inline char nc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
#define getchar nc
int read()
{
char ch = getchar();
int num = , fl = ;
for (; !isdigit(ch); ch=getchar())
if (ch=='-') fl = -;
for (; isdigit(ch); ch=getchar())
num = (num<<)+(num<<)+ch-;
return num*fl;
}
void write(int x){if (x/) write(x/);putchar(x%+'');}
void makePrime(int Top)
{
for (int i=; i<=Top; i++)
{
if (!vis[i]) res[i] = i, pr[++pr[]] = i;
for (int j=; j<=pr[]&&1ll*pr[j]*i<=Top; j++)
{
vis[i*pr[j]] = , res[i*pr[j]] = pr[j];
if (i%pr[j]==) break;
}
}
}
bool merge(int l, int r, int fat)
{
if (l > r) return ;
int L = l, R = r;
while (L <= R)
{
if (pre[L] < l&&nxt[L] > r){
fa[L] = fat;
return merge(l, L-, L)&&merge(L+, r, L);
}
if (pre[R] < l&&nxt[R] > r){
fa[R] = fat;
return merge(l, R-, R)&&merge(R+, r, R);
}
L++, R--;
}
return ;
}
int main()
{
n = read();
for (REG i=; i<=n; i++) a[i] = read(), mx = a[i]>mx?a[i]:mx;
makePrime(mx);
for (REG i=; i<=n; i++)
{
REG num = a[i], tmp = , div;
while (num!=)
{
div = res[num];
if (lst[div] > tmp) tmp = lst[div];
lst[div] = i;
while (num%div==) num /= div;
}
pre[i] = tmp;
}
for (REG i=; i<=mx; i++) lst[i] = n+;
for (REG i=n; i; i--)
{
REG num = a[i], tmp = n+, div;
while (num!=)
{
div = res[num];
if (lst[div] < tmp) tmp = lst[div];
lst[div] = i;
while (num%div==) num /= div;
}
nxt[i] = tmp;
}
if (merge(, n, )){
for (REG i=; i<=n; i++)
write(fa[i]), putchar(i!=n?' ':'\n');
}else puts("impossible");
return ;
}

END

【启发式拆分】bzoj5200: [NWERC2017]Factor-Free Tree的更多相关文章

  1. bzoj4059 [Cerc2012]Non-boring sequences && bzoj5200 [NWERC2017]Factor-Free Tree

    https://konnyakuxzy.github.io/BZPRO/JudgeOnline/4059.html https://cn.vjudge.net/problem/Gym-100624D ...

  2. 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences

    这个做法名字是从武爷爷那里看到的…… Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子 ...

  3. dsu on tree (树上启发式合并) 详解

    一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有 ...

  4. webpack常用配置总结

    1. webpack简介 webpack 是一个模块打包工具.它使得模块相互依赖并且可构建等价于这些模块的静态资源.相比于已经存在的模块打包器(module bundler),webpack的开发动机 ...

  5. Mango DS Training #48 ---线段树2 解题手记

    Training address: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=38966#overview A.Count Color ...

  6. [Coderforces600E] Lomsat gelral

    大意是每个点有一个颜色,询问以每个点为根的子树中出现次数最多的颜色是谁,如果有多个输出编号和. 这个东西用数据结构是不太好做的,考虑优化暴力. 首先最裸的的暴力就是在dfs序上跑莫队,但因为是树的结构 ...

  7. webpack 功能大全 【环境配置】

    1. webpack简介 webpack 是一个模块打包工具.它使得模块相互依赖并且可构建等价于这些模块的静态资源.相比于已经存在的模块打包器(module bundler),webpack的开发动机 ...

  8. 高度平衡树 -- AVL 树

    Scheme 的表达, 优雅. #lang scheme ( define nil '() ) ( define ( root tree )( car tree ) ) ( define ( left ...

  9. 数据结构( Pyhon 语言描述 ) — —第10章:树

    树的概览 树是层级式的集合 树中最顶端的节点叫做根 个或多个后继(子节点). 没有子节点的节点叫做叶子节点 拥有子节点的节点叫做内部节点 ,其子节点位于层级1,依次类推.一个空树的层级为 -1 树的术 ...

随机推荐

  1. 【ZJOI2007】捉迷藏 小小的总结

    2019-01-09 22:56:33 终于终于把这道题目做掉了... 做了两个晚上..不知道为什么自己如此之笨.. 在洛谷上断断续续一共交了24次,感觉自己都要被封号了. 昨天花半个晚上从零开始研究 ...

  2. according to tld or attribute directive in tag file attribute *** does not accept any expressions

    http://stackoverflow.com/questions/13428788/according-to-tld-or-attribute-directive-in-tag-file-attr ...

  3. npm ERR! missing script: build

    webpack-bundle-analyzer webpack可视化插件,用来查看一共打了多少个包,每个包的体积和包里面的情况. 启动查看 npm run build --report 结果报错npm ...

  4. 详解环境搭建SSM

    1.概述: SSM即为spring 4 +spring mvc +mybatis 3.4.6 推荐使用maven或者gradle 来配置 下面给出maven配置方式 2.项目结构: 新建web项目 这 ...

  5. Django-Rest-Framework的解析器和渲染器

    Django-Rest-Framework的解析器和渲染器  restful framework 解析器 解析器的作用就是服务端接收客户端传来的数据,把数据解析成自己想要的数据类型的过程 本质就是对请 ...

  6. c#字符串字面量

    分为两种: 1 常规字符串字面量 2逐字字面量字符串:以@字符为前缀.注意:注意逐字字面量唯一例外的是相邻的双引号组,它们被解释为单个双引号字符.

  7. Selenium 开源书(一): Selenium历史

    Selenium历史 Selenium最初由Jason Huggins于2004年开发,作为ThoughtWorks的内部工具.Huggins后来加入了ThoughtWorks的其他程序员和测试人员, ...

  8. Zeppelin的入门使用系列之使用Zeppelin来运行Spark SQL(四)

    不多说,直接上干货! 前期博客 Zeppelin的入门使用系列之使用Zeppelin来创建临时表UserTable(三) 1. 运行年龄统计的Spark SQL (1)  输入Spark SQL时,必 ...

  9. ASP.Net 页面和后台执行的先后顺序

    后台的Page_Load事件——>前台页面加载

  10. Linq Enumerable.Distinct方法去重

    Enumerable.Distinct 方法 是常用的LINQ扩展方法,属于System.Linq的Enumerable方法,可用于去除数组.集合中的重复元素,还可以自定义去重的规则. 有两个重载方法 ...