【JZOJ6368】质树(tree)
description
大神 wyp 手里有棵二叉树,每个点有一个点权。大神 wyp 的这棵树是质树,因为
随便找两个不同的点 u, v,只要 u 是 v 的祖先,都满足 u 和 v 的点权互质。
现在你通过偷看了解到了大神 wyp 这棵树的中序遍历的点权值,你想复原出大神
wyp 的树,或者指出不可能。
阅读样例以更好地理解本题。
analysis
首先预处理质数,对于每个数,可以分解质因数
然后用一个桶前后各扫一遍分别得出每个数往前往后区间内与其都互质的最远位置
如果对于\([l,r]\)区间,枚举一个可行位置\(i\),拆分成\([l,i-1],[i+1,r]\),复杂度\(O(n^2)\)
但是如果同时从头和尾往中间找,每个层搜索长度减半,复杂度\(O(n\log_2n)\)
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 1000005
#define MAX 10000005
#define ll long long
#define reg register ll
#define ha 1926081719491001
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
using namespace std;
bool bz[MAX];
ll left[MAXN],right[MAXN];
ll a[MAXN],p[MAX],bucket[MAX],fa[MAXN],mxp[MAX];
ll n,tot,flag=1;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline void init()
{
#define MAXX 10000000
memset(bz,1,sizeof(bz));
fo(i,2,MAXX)
{
if (bz[i])p[++tot]=i,mxp[i]=i;
for (reg j=1;j<=tot && i*p[j]<=MAXX;++j)
{bz[i*p[j]]=0,mxp[i*p[j]]=p[j];if (i%p[j]==0)break;}
}
}
inline bool judge(ll i,ll l,ll r)
{
if (left[i]<=l && right[i]>=r)return 1;
return 0;
}
inline void dfs(ll l,ll r,ll x)
{
if (l>r)return;
if (l==r){fa[l]=x;return;}
fo(len,0,(r-l)/2)
{
ll i=l+len,j=r-len;
if (judge(i,l,r))
{
fa[i]=x,dfs(l,i-1,i),dfs(i+1,r,i);
return;
}
if (judge(j,l,r))
{
fa[j]=x,dfs(l,j-1,j),dfs(j+1,r,j);
return;
}
}
flag=0;return;
}
int main()
{
//freopen("T3.in","r",stdin);
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
n=read(),init();fo(i,1,n)a[i]=read();
fo(i,1,n)
{
ll x=a[i];left[i]=1;
while (x>1)
{
ll tmp=mxp[x];
left[i]=max(left[i],bucket[tmp]?bucket[tmp]+1:1);
bucket[tmp]=i;
while (x%tmp==0)x/=tmp;
}
}
memset(bucket,0,sizeof(bucket));
fd(i,n,1)
{
ll x=a[i];right[i]=n;
while (x>1)
{
ll tmp=mxp[x];
right[i]=min(right[i],bucket[tmp]?bucket[tmp]-1:n);
bucket[tmp]=i;
while (x%tmp==0)x/=tmp;
}
}
tot=0,dfs(1,n,0);
if (!flag){printf("impossible\n");return 0;}
fo(i,1,n)printf("%lld ",fa[i]);
return 0;
}
【JZOJ6368】质树(tree)的更多相关文章
- 树(tree)
树(tree)[题目描述]从前在森林里面有一棵很大的树,树上住着很多小动物.树上有
- JS--插件: 树Tree 开发与实现
日常在Web项目开发时,经常会碰到树形架构数据的显示,从数据库中获取数据,并且显示成树形.为了方便,我们可以写一个javascript的一个跨浏览器树控件,后续可以重复使用.本节分享一个自己开发的JS ...
- 淀粉质模板 Tree
Tree 题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式: N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 ...
- 6368. 【NOIP2019模拟2019.9.25】质树
题目 题目大意 有个二叉树,满足每个点跟它的所有祖先互质. 给出二叉树的中序遍历的点权,还原一种可能的方案. 思考历程 首先想到的当然是找到一个跟全部互质的点作为根,然后左右两边递归下去处理-- 然而 ...
- 轻量级jquery框架之--树(tree)
前言 在常用的UI组件中,树形组件与数据列表组件可以说是构成一个管理平台基本的两大数据核心组件.树形组件用于系统菜单,数据列表用于数据表现,两者配合即可完成一个简单的数据系统.要实现一个支持复选.工具 ...
- layui实现checkbox的目录树tree
layui.use([ 'tree' ], function() {$ = layui.jquery;form = layui.form;//获取节点数据getTreeData();}); funct ...
- 数据结构(二) 树Tree
五.树 树的定义 树的逻辑表示:树形表示法.文氏图表示法.凹入表示法.括号表示法. 结点:表示树中的元素,包括数据项及若干指向其子树的分支. 结点的度:结点拥有的子树树:树的度:一 ...
- Python与数据结构[3] -> 树/Tree[2] -> AVL 平衡树和树旋转的 Python 实现
AVL 平衡树和树旋转 目录 AVL平衡二叉树 树旋转 代码实现 1 AVL平衡二叉树 AVL(Adelson-Velskii & Landis)树是一种带有平衡条件的二叉树,一棵AVL树其实 ...
- Python与数据结构[3] -> 树/Tree[1] -> 表达式树和查找树的 Python 实现
表达式树和查找树的 Python 实现 目录 二叉表达式树 二叉查找树 1 二叉表达式树 表达式树是二叉树的一种应用,其树叶是常数或变量,而节点为操作符,构建表达式树的过程与后缀表达式的计算类似,只不 ...
随机推荐
- c# Winform 多线程操作
主要是对一个过程需要的时间很长执行时会出现界面假死的情况 方法1: Application.DoEvents(),这种方法当你拖动窗体时,界面不会假死.但在你拖动时代码不再执行,也就是阻塞了,当你不再 ...
- python面试题之你如何管理不同版本的代码?
答案: 版本管理!被问到这个问题的时候,你应该要表现得很兴奋,甚至告诉他们你是如何使用Git(或是其他你最喜欢的工具)追踪自己和奶奶的书信往来.我偏向于使用Git作为版本控制系统(VCS),但还有其他 ...
- 【CF886E】Maximum Element
题目 考虑正难则反,答案即为\(n!-\text{返回值为n的排列数}\) 一个排列的返回值为\(n\),当且仅当在\(n\)出现之前没有一个数后面有连续\(k\)个小于它的数 设\(f_i\)表示\ ...
- sanic连接mongo
方法一: #没有密码,就是没有用户和用户密码 settings={"MOTOR_URI":"mongodb://127.0.0.1:27017/zzy"} ap ...
- IDEA 创建Spring cloud Eureka 注册中心
IDEA 创建Spring cloud Eureka 注册中心 一. 首先创建一个maven project Next之后填好groupId与artifactId,Next之后填好项目名与路径,点击F ...
- 一个服务io占满,服务器无响应
(1).服务器io占满,服务无响应, sar -q -f /var/log/sa/sa28 上图显示plist-sz 增加了一倍 plist-sz 说明:进程列表中的进程(processes)和线程 ...
- 随笔记录 shell脚本相关内容 2019-8-26
字符串截取: 假设变量为var=http://www.hao.com/123.htm1. # 号截取,删除左边字符,保留右边字符.echo ${var#*//}其中 var 是变量名,# 号是运算符, ...
- Eureka备忘
一. 二. 2.2. eureka集群同步集群相关重要的类com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl: 为了保证集群里所有Eur ...
- linux 套接字
三.命名套接字 之前的socket只是创建了一个没有名字的资源,其他进程无法访问他.所以也无法从它接受消息.只有当bind给套接字绑定了端口和名字后,其他进程才能找到它. 一般服务器是一定要bind, ...
- 阿里巴巴AI夺肝结节诊断两项世界冠军,至今无人超越
在澳门用人工智能预测流感趋势后,阿里巴巴还在继续探索如何用科技保障人类健康,这一次是更准确地测量肝结节. 12月28日消息,在全球LiTS(Liver Tumor Segmentation Chall ...