首页 > 其他分享 >POI2012ODL-Distance

POI2012ODL-Distance

时间:2024-04-25 09:04:16浏览次数:27  
标签:POI2012ODL Distance cnt res rep second mx first

POI #Year2012 #数学

记 \(cnt(x)\) 为 \(x\) 的因子个数

\(d(i,j)=cnt(a_i)+cnt(a_j)-2cnt(gcd(i,j))\)

枚举 \(i\) ,剩下的时间复杂度可以枚举 \(gcd\) ,考虑此时应该贪心的取 \(cnt(a_j)\) 最小的 \(j\)

这样不能保证枚举的 \(gcd=gcd(a_i,a_j)\) 但是在 \(gcd=gcd(a_i,a_j)\) 的时候可以取到最小值,所以等价

// Author: xiaruize
const int N = 1e5 + 10;
const int M = 1e6 + 10;

int n;
int a[N];
int cnt[M];
pii mx[M][2];
pii res[N];
vector<int> pr;

void init()
{
	// cnt[1] = 1;
	rep(i, 2, 1e6)
	{
		if (!cnt[i])
		{
			cnt[i] = 1;
			pr.push_back(i);
		}
		for (auto v : pr)
		{
			if (v * i > 1e6)
				break;
			cnt[v * i] = cnt[i] + 1;
			if (i % v == 0)
				break;
		}
	}
}

void upd(int x, pii v)
{
	if (v.first < mx[x][0].first || (v.first == mx[x][0].first && v.second < mx[x][0].second))
	{
		mx[x][1] = mx[x][0];
		mx[x][0] = v;
	}
	else if (v.first < mx[x][1].first || (v.first == mx[x][1].first && v.second < mx[x][1].second))
		mx[x][1] = v;
}

void chkmi(pii &x, pii y)
{
	if (x.first > y.first || (x.first == y.first && x.second > y.second))
		x = y;
}

void solve()
{
	init();
	cin >> n;
	rep(i, 1, n) cin >> a[i];
	mms(mx, 0x3f);
	mms(res, 0x3f);
	rep(i, 1, n)
	{
		rep(j, 1, a[i])
		{
			if (j * j > a[i])
				break;
			if (a[i] % j != 0)
				continue;
			upd(j, {cnt[a[i]], i});
			if (j * j != a[i])
				upd(a[i] / j, {cnt[a[i]], i});
		}
	}
	rep(i, 1, n) debug(i, mx[i]);
	rep(i, 1, n)
	{
		rep(j, 1, a[i])
		{
			if (j * j > a[i])
				break;
			if (a[i] % j != 0)
				continue;
			if (mx[j][0].second == i)
				chkmi(res[i], {mx[j][1].first + cnt[a[i]] - cnt[j] * 2, mx[j][1].second});
			else
				chkmi(res[i], {mx[j][0].first + cnt[a[i]] - cnt[j] * 2, mx[j][0].second});
			if (j * j != a[i])
			{
				if (mx[a[i] / j][0].second == i)
					chkmi(res[i], {mx[a[i] / j][1].first + cnt[a[i]] - cnt[a[i] / j] * 2, mx[a[i] / j][1].second});
				else
					chkmi(res[i], {mx[a[i] / j][0].first + cnt[a[i]] - cnt[a[i] / j] * 2, mx[a[i] / j][0].second});
			}
		}
	}
	rep(i, 1, n)
	{
		debug(res[i]);
		cout << res[i].second << endl;
	}
}

#ifndef ONLINE_JUDGE
bool end_of_memory_use;
#endif

signed main()
{
	// freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int testcase = 1;
	// cin >> testcase;
	while (testcase--)
		solve();
#ifndef ONLINE_JUDGE
	cerr << "Memory use:" << (&end_of_memory_use - &start_of_memory_use) / 1024.0 / 1024.0 << "MiB" << endl;
	cerr << "Time use:" << (double)clock() / CLOCKS_PER_SEC * 1000.0 << "ms" << endl;
#endif
	return 0;
}

标签:POI2012ODL,Distance,cnt,res,rep,second,mx,first
From: https://www.cnblogs.com/xiaruize/p/18156734

相关文章

  • CF1535F String Distance
    \(CF1535F\\String\Distance\)题意给\(n\)个长度均为\(len\)的字符串\(T_1,T_2,\dotsT_n\),定义\(f(a,b)\)为将\(a,b\)排序后相等的最小排序次数,若无解则为\(1337\)(这好像是个黑客用语)。求\[\sum_{i=1}^{n}\sum_{j=i+1}^{n}f(T_i,T_j)\]其中\[n\timeslen......
  • 「Over-Distance」观察栏目开启
    「我已经触碰过『天空』」QIANYAN——前言所以……为什么会写这个呢?这也是一个谜。大概是我不满意当今的「环境」吧,被黑夜遮盖的天空也不会有繁星。也许是疲倦了,人们纷纷拉上窗帘,不愿直视黑黝黝的夜空。那里已经被「毁灭」了。这是逃不掉的命运。JIESHAO——介绍「Ov......
  • LeetCode 834. Sum of Distances in Tree
    原题链接在这里:https://leetcode.com/problems/sum-of-distances-in-tree/description/题目:Thereisanundirectedconnectedtreewith n nodeslabeledfrom 0 to n-1 and n-1 edges.Youaregiventheinteger n andthearray edges where edges[i]=[a......
  • Distance Learning Courses in MAC
    这道题目其实我们如果位运算的题目有取值范围的话(这道题目的\([x,y]\)),我们可以统计公共前缀首先对于一个数对\((x_i,y_i)\)(假设\(x_i≠y_i\)),我们先统计他们的最长公共前缀比如\(000110101\)和\(000111000\),他们的最长公共前缀就是\(000110000\)(位数都是\(32\)位,这里省略了,公共前......
  • AT_abc283_f [ABC283F] Permutation Distance 题解
    分析分类讨论。对\(|p_i-p_j|+|i-j|\)分类讨论,有:\((p_i+i)-(p_j+j)\),\(p_i>p_j\landi>j\)。\(-(p_i-i)+(p_j-j)\),\(p_i<p_j\landi>j\)。\((p_i-i)-(p_j-j)\),\(p_i>p_j\landi<j\)。\(-(p_i+i)+(p_j+j)\),\(p_i<p_j\landi<j......
  • CF1935E Distance Learning Courses in MAC
    CF1935EDistanceLearningCoursesinMAC题目大意给定\(n\)个变量\(z_i\in[x_i,y_i]\),你可以在范围内任意指定\(z_i\)的值。\(q\)次查询,每次查询给定区间\([l_i,r_i]\),求用这些变量得到的二进制或最大值。思路选择\(z\in[x,y]\),贡献分为两部分(1)\([x,y]\)的......
  • [ARC165C] Social Distance on Graph
    转化题意,对图进行黑白染色,求最大的\(X\)满足所有\(u,v\)间最短路径小于\(X\)的\(u,v\)异色。很明显是二分答案,假设现在二分到\(mid\),转化为判定型问题。直接\(n^2\)枚举点肯定不对。发现性质:如果\(u,v\)的最短路径长度小于\(X\)且最短路径上经过的边数大于\(......
  • 大胆假设小心验证——cf_922_C. XOR-distance
    目录问题概述思路想法参考代码问题反思问题概述给出整数a、b、r,要求输出|(a^x)-(b^x)|的绝对值,其中0<=x<=r(取值都是[0,1e18])思路想法首先是一个位置关系,由于求的是绝对值,所以我们可以假定a>b;第二,我们要做的是异或操作,因此可以将a和b的二进制数写出来,结合异或的特点,可以发......
  • CodeForces 1266F Almost Same Distance
    洛谷传送门CF传送门好厉害。特判\(k=1\)。首先经过观察,我们可以按照\(k\)的奇偶性讨论:\(k\)为偶数,有一个中心点挂了若干条长度为\(\frac{k}{2}\)的链。\(k\)为偶数,有两个中心点,两边挂了若干条长度为\(\frac{k}{2}\)的链;\(k\)为奇数,有一个中心点挂了若干条长度......
  • CF1881F Minimum Maximum Distance 题解
    因为白点对\(f_i\)没有贡献,所以可以重构出一棵原树的子树,使得所有的叶子都为标记点且标记点数量不变(没有删去标记点)。因为没有标记被删去且结构不变,所以这棵树的答案与原树答案相同。现在,对于所有节点,到它距离最大的标记点一定在叶子上。那么问题就变为:求出树上任意一点到所有......