F - Factor-Free Tree Gym - 101623F(质数,中序遍历,区间)

2024-04-15 23:48

本文主要是介绍F - Factor-Free Tree Gym - 101623F(质数,中序遍历,区间),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

题意:
给出一颗树的中序遍历,要求还原这棵树使得每一个节点的值和其祖先互质

思路:
参考claris博客题解。

对每个数质因子分解,算出每个数左边的第一个不互质位置,右边第一个不互质位置。
维护每个点对应的区间,也就是其对应子树。
将这些区间放在栈里面,如果当前区间包含栈顶区间,那么弹出栈顶。
则按照中序遍历左中右的顺序,最后一个弹出的区间为当前点的左子树,当前栈顶区间为节点父子节点。

则无解情况为栈顶区间不包含当前区间,此时父节点不能包括子节点。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
using namespace std;const int INF = 0x3f3f3f3f;
const int maxn = 1e6 + 7;
const int MAXN = 1e7 + 7;
struct STK {int l,r;int id;
}stk[maxn];int n;
int fa[maxn];
int L[maxn],R[maxn],a[maxn];
int pre[MAXN],p[MAXN],v[MAXN],tot;void init() {for(int i = 2;i < MAXN;i++) {if(!v[i]) {p[++tot] = i;v[i] = i;}for(int j = 1;j <= tot && 1ll * i * p[j] < MAXN;j++) {v[i * p[j]] = p[j];if(i % p[j] == 0) break;}}
}void Pre() {for(int i = 1;i <= n;i++) {int x = a[i];while(x > 1) {L[i] = max(L[i],pre[v[x]]);x /= v[x];}L[i]++;x = a[i];while(x > 1) {pre[v[x]] = i;x /= v[x];}}for(int i = 2;i < MAXN;i++) pre[i] = n + 1;for(int i = n;i >= 1;i--) {R[i] = n + 1;int x = a[i];while(x > 1) {R[i] = min(R[i],pre[v[x]]);x /= v[x];}R[i]--;x = a[i];while(x > 1) {pre[v[x]] = i;x /= v[x];}}
}int main() {init();scanf("%d",&n);for(int i = 1;i <= n;i++) scanf("%d",&a[i]);Pre();int top = 0;stk[0].l = 0;stk[0].r = INF;for(int i = 1;i <= n;i++) {int left = i;stk[top + 1].id = 0;while(L[i] <= stk[top].l && stk[top].r <= R[i]) {left = min(left,stk[top].l);top--;}fa[stk[top + 1].id] = i;fa[i] = stk[top].id;stk[++top].l = left;stk[top].id = i;stk[top].r = min(R[i],stk[top - 1].r);if(stk[top - 1].r < i) {printf("impossible\n");return 0;}}for(int i = 1;i <= n;i++) {printf("%d ",fa[i]);}return 0;
}

这篇关于F - Factor-Free Tree Gym - 101623F(质数,中序遍历,区间)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907260

相关文章

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr