首页 > 其他分享 >[题解] CFgym101623F Factor-Free Tree

[题解] CFgym101623F Factor-Free Tree

时间:2023-11-13 19:13:49浏览次数:40  
标签:CFgym101623F int 题解 Tree mid mnp le MAXN 互质

Factor-Free Tree

当一棵二叉树中的每个节点的权值都与它所有祖先的权值互质时,我们称它为 factor-free tree。
给你一棵按照中序遍历的顺序的权值序列 \(a\),求这个序列是否对应这一棵 factor-free tree。
如果是就输出每个节点的父亲。
\(n \le 10^5, a_i \le 10^7\)。

考虑怎么找到一棵 factor-free tree:先找到一个与其他所有数都互质的数当根,然后再递归左右两边。可以注意到如果有多个数互质选哪个都是无所谓的,因为最后总会将序列划分成相同的形态。

为了做这个东西,首先要能快速判断一个数是否与这个区间内的其他数互质。这个可以考虑对每个位置预处理出 \(L_i\) 和 \(R_i\) 表示这个数左右两边第一个不和它互质的数,然后对于一个区间 \([l, r]\),判断区间内的数手否和它互质就是判断是否有 \(L_i \le l, r \le R_i\)。

然后可以发现这个东西最慢是 \(O(n^2)\) 的,所以还要继续优化。

对于这个递归过程,想要让它的时间复杂度正确,需要要求每次遍历的时间复杂度和 \([l, mid]\) 和 \([mid, r]\) 中较短的区间的长度相关,这样就是 \(O(n \log n)\) 的。所以考虑怎么让每次遍历的时间复杂度变成 \(O(\min(mid - l, r - mid))\)。

我们可以从 \(l\) 和从 \(r\) 同时找,这样就是 \(O(\min(mid - l, r - mid))\) 的了。

时间复杂度 \(O(n \log n)\)。

constexpr int MAXN = 1e6 + 9, MAXV = 1e7 + 9, MAXP = 7e5;
int n, a[MAXN], mnp[MAXV], id[MAXV], L[MAXN], R[MAXN],
	fa[MAXN];
vector<int> pri, pos[MAXP];
bitset<MAXV> vis;

void sieve(int N) {
	vis.reset();
	for (int i = 2; i <= N; i ++) {
		if (!vis[i]) {
			id[i] = pri.size();
			pri.emplace_back(i);
			mnp[i] = i;
		}
		for (auto j : pri) {
			if (1ll * i * j > N) break;
			vis[i * j] = 1, mnp[i * j] = j;
			if (i % j == 0) break;
		}
	}
	return;
}

bool Solve(int l, int r, int rt) {
	if (l > r) return true;
	int pl = l, pr = r, mid = 0;
	auto check = [&](int x) { return L[x] <= l && r <= R[x]; };
	while (pl <= pr) {
		if (check(pl)) { mid = pl; break; }
		if (check(pr)) { mid = pr; break; }
		pl ++, pr --;
	}
	if (mid) { fa[mid] = rt; return Solve(l, mid - 1, mid) && Solve(mid + 1, r, mid); }
	return false;
}

void slv() {
	n = Read<int>(), sieve(1e7);
	for (int i = 1; i <= n; i ++) a[i] = Read<int>();
	auto Divide = [&](int p) {
		int t = a[p];
		while (t != 1) {
			pos[id[mnp[t]]].emplace_back(p);
			t /= mnp[t];
		}
		return;
	};
	for (int i = 1; i <= n; i ++) Divide(i), L[i] = 0, R[i] = n + 1;
	for (int i = 0; i < pri.size(); i ++) {
		pos[i].emplace_back(0), pos[i].emplace_back(n + 1);
		sort(pos[i].begin(), pos[i].end());
		pos[i].erase(unique(pos[i].begin(), pos[i].end()), pos[i].end());
		for (int j = 1; j + 1 < pos[i].size(); j ++)
			cmax(L[pos[i][j]], pos[i][j - 1] + 1),
			cmin(R[pos[i][j]], pos[i][j + 1] - 1);
	}
	if (!Solve(1, n, 0)) { Puts("impossible"); return; }
	for (int i = 1; i <= n; i ++) Write(fa[i], ' ');
	return;
}

标签:CFgym101623F,int,题解,Tree,mid,mnp,le,MAXN,互质
From: https://www.cnblogs.com/definieren/p/17829875.html

相关文章

  • SP2139题解
    思路这题数据范围小,暴力就可以了。首先我们用map来统计每个人的下标,用\(bk_{i,j}\)表示第\(i\)个人第\(j\)题是否知道答案。对于每次合作交流,暴力修改就可以了,先统计出两个人的下标,假设一个为\(x\),另一个为\(y\)。然后,如果\(bk_{x,i}\)和\(bk_{y,i}\)中(\(1\lei......
  • [ARC106E] Medals 题解
    题意有一个商店和\(N\)名员工,其中第\(i\)名员工在第\(1\simA_i\)天工作,在第\(A_i+1\sim2\timesA_i\)休息,接下来每\(A_i\)天改变一次状态。每一天你都可以选择一名来上班的员工并为其颁一个奖,求使得每名员工都获得至少\(K\)个奖的最小天数。\(1\leN\le......
  • [题解] CF1156E Special Segments of Permutation
    SpecialSegmentsofPermutation给你一个排列\(p\),求有多少个区间\([l,r]\)满足\(p_l+p_r=\max_{i\in[l,r]}p_i\)。\(n\le2\times10^5\)。按最大值分治,记当前的分治中心为\(mid\),分治区间为\([l,r]\)。然后需要计算跨分治中心的贡献。如果\(mid-l......
  • [题解]AT_abc328_f [ABC328F] Good Set Query
    思路带权并查集模板。如果对于一个三元组\((a,b,c)\)如果它能够添加到\(S\)中一定满足如下条件中的一条:\(X_a,X_b\)满足其中有一个是「不确定」的。在这里\(X_i\)「不确定」指\(X_i\)没有与其它的任意\(X_j\)有关系。\(X_a,X_b\)有间接或直接的关系,但是能计算......
  • CF300B Coach 题解
    闲话调了好一会,甚至还重构了一次代码才对,但是还是很喜欢并查集,并查集可爱捏。题意省流$n$个学生分成$3$人一组,要满足$m$个条件,每个条件给出两个数$x,y$,要求$x$和$y$必须在一个组里。正文要使学生三人一组,一眼使用并查集。首先考虑无解(输出$-1$)的情况:给出的限......
  • 【题解 P8476】 惊蛰
    「GLR-R3」惊蛰题目背景  「微雨众卉新,一雷惊蛰始」  中午,休息室,阿绫肩膀上。  “我有一个愿望,参加全国音乐祭,获奖,和阿绫一起,摆脱这训练的苦海。”  “为热爱而到来,为抽身而努力……吗”。  正午的阳光渗过窗帘,抚上困倦的人儿的脸颊。天依的左手悄悄搭上阿绫怀里......
  • NOJ题解
    NOJ题解30-40素数埃氏筛,欧拉筛都可可变参数累加/平均用给出的库函数即可基思数根据题意模拟#include<stdio.h>#definelllonglongllnum[102];inlineboolIsKeith(lln){inttot=0,t=0;lls=n;while(s){num[++tot]=s%10......
  • 问题解答:SAP OData V2 和 V4 里针对日期类型的字段进行过滤操作(filter)的正确语法试
    我的知识星球里有朋友咨询一个问题:我测试了一个S/4HANAcloud的purchaseorder的API,这个是ODATAV4格式的。在对CreationDate做filter后运行有报错Invalidparametertypeusedwithfunction'eq'.对datetime字段做filter,一直搞不清楚格式。请帮忙看一下。本文就安排这......
  • 【刷题笔记】108. Convert Sorted Array to Binary Search Tree
    题目Givenanarraywhereelementsaresortedinascendingorder,convertittoaheightbalancedBST.Forthisproblem,aheight-balancedbinarytreeisdefinedasabinarytreeinwhichthedepthofthetwosubtreesof every nodeneverdifferbymorethan......
  • TreeSet
    TreeSet的基本操作放到TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序(默认升序)//集合的创建TreeSet<Integer>treeSet=newTreeSet<>();//添加元素treeSet.add(1);treeSet.add(10);treeSet.add(199);treeSet.add(41);treeSet.add(0);//遍......