首页 > 其他分享 >Codeforces Round 884 (Div. 1 + Div. 2) B. Permutations & Primes

Codeforces Round 884 (Div. 1 + Div. 2) B. Permutations & Primes

时间:2023-10-18 20:58:49浏览次数:33  
标签:std 884 int Permutations 构造 尽可能 Div mex

给一个正整数 \(n\) ,你需要构造一个 \(n\) 的排列 \(p_1, p_2, \cdots, p_n\) 。对于排列 \(p\) 的每个子段 \([l, r]\) ,\(mex_{i = l}^{r} a_i\) 的结果为质数的次数尽可能多。

此处的 \(mex\) 最小排除值最低为 \(1\) 而非 \(0\) 。

不难想到,小质数 \(2, 3\) 容易构造。

于是有贪心算法:让 \(1\) 在尽可能多的子段里,而 \(2\) 离 \(1\) 尽可能远。于是可以构造出尽可能多的 \(mex = 2\) 的子段。再让 \(3\) 离 \(2\) 尽可能远,于是可以构造出尽可能多的 \(mex = 3\) 的子段。

要使 \(1\) 在尽可能多的子段里,\(1\) 应该在 \(\lceil \frac{n}{2} \rceil\) 位置。

  • 根据第 \(i\) 个元素会在 \((i - 0) \times (n - i + 1)\) 个子段中的性质

然后让 \(2\) 在 \(1\) 位置,\(3\) 在 \(n\) 位置。

此时可以观察出,除了 \([l, r]\) 这一段的 \(mex = 4\) ,所有段的 \(mex \leq 3\) 。于是上述的贪心算法可以在构造完 \(3\) 后截止。

view
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve(){
	int n; std::cin >> n;
	if (n == 1) std::cout << "1\n";
	else if (n == 2) std::cout << "1 2\n";
	else {
		std::vector<int> a(n+1);
		a[(n+1)/2] = 1;
		a[1] = 2;
		a[n] = 3;
		int cur = 4;
		for (int i = 1; i <= n; i++) if (!a[i]) a[i] = cur++;
		for (int i = 1; i <= n; i++) std::cout << a[i] << " \n"[i==n];
	}
}
		                
int main() {
	#ifndef ONLINE_JUDGE
    freopen("IO/in", "r", stdin); freopen("IO/out", "w", stdout);
	#endif 
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
}

标签:std,884,int,Permutations,构造,尽可能,Div,mex
From: https://www.cnblogs.com/zsxuan/p/17773286.html

相关文章

  • CF73D FreeDiv
    首先先把原图中的连通信息求一下,不妨设其中有\(tot\)个连通块,每个连通块的大小为\(sz_i\)考虑第二步操作时我们需要连\(tot-1\)条边使得图连通,而每个连通块中只有\(\min(sz_i,k)\)个点可以参与连边因此如果\(\sum_{i=1}^{tot}\min(sz_i,k)\ge2\times(tot-1)\)的话此时的局面......
  • Codeforces Round 882 (Div. 2) B. Hamon Odyssey
    给一个长为\(n\)的数组\(a_1,a_2,\cdots,a_n\)。定义\(f(l,r)=\&_{i=l}^{r}a_i\)。你需要对\(a\)进行分段,使得各段的\(f(l,r)\)之和最小。在各段\(f(l,r)\)之和最小的情况下,尽可能分出更多的段。输出满足上述条件下,\(a\)可分的段数。......
  • div通过append添加的元素无法通过jquery元素选择器选择
    $("#"+msgid).append(data+'<br><br><br><divclass="box-copy"id='+copyid+'>复制内容</div>')此时无法通使用$(".box-copy").click()需要使用:$(document).on('click','......
  • Codeforces Round 888 (Div. 3) C. Tiles Comeback
    有\(n\)块瓷砖和一个正整数\(k\),第\(i\)块瓷砖染色为\(c_i\)。一开始站在第\(1\)块瓷砖往,然后可以开始往右跳吗,到第\(n\)块瓷砖停止。你可以得到的路径长度\(p\)为你从\(1\)到\(n\)踩过瓷砖的数量。你需要确定是否存在一条长度为\(p\)的路径满足。\(k\mid......
  • Codeforces Round 893 (Div. 2) C. Yet Another Permutation Problem
    有一个\(gcd\)游戏,按以下步骤进行:选择一个\(n\)的排列\(p_1,p_2,\cdots,p_n\)。对于每个\(i\),\(d_i=gcd(p_i,p_{i\%n+1})\)排列\(p\)的\(score\)为数组\([d_1,d_2,\cdots,d_n]\)中不同数的个数。给一个\(n\),需要构造一个排列\(p\),使得\(sco......
  • Codeforces Round 892 (Div. 2) B. Olya and Game with Arrays
    一系列\(n\)个数组,第\(i\)个数组的大小\(m_i\geq2\)。第\(i\)个数组为\(a_{m_1},a_{m_2},\cdots,a_{m_i}\)。对于每个数组,你可以移动最多一个元素到另一个数组。一系列\(n\)个数组的\(beauty\)定义为\(\sum_{i=1}^{n}min_{j=1}^{m_i}a_{i,j}\)。询问你......
  • Codeforces Round #870 (Div. 2) A. Trust Nobody
    题解#include<cstdio>#include<vector>#include<queue>#include<cstring>#include<algorithm>#include<iostream>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include......
  • 记录--怎么写一个可以鼠标控制旋转的div?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助说在前面鼠标控制元素旋转在现在也是一个很常见的功能,让我们从实现div元素的旋转控制开始来了解元素旋转的具体原理和实现方法吧。效果展示体验地址code.juejin.cn/pen/7290719…实现步骤画一个div首先我......
  • 【转】dive into golang database/sql(1)
    转,原文:https://www.jianshu.com/p/3b0b3a4c83da ---------------数据库操作是一个应用必不可少的部分,但是我们很多时候对golang的sql包仅仅是会用,这是不够的。每一条语句的执行,它的背后到底发生了什么。各式各样对sql包的封装,是不是有必要的,有没有做无用功?这是gotodataba......
  • 【转】dive into golang database/sql(3)
    转,原文: https://www.jianshu.com/p/cd8cee3d7fc3 ----------------上一章中我们一起探讨了golangdatabase/sql包中如何获取一个真实的数据库连接。当我们拿到一个数据库连接之后就可以开始真正的数据库操作了。本章讲继续深入,一起探讨底层是如何进行数据库操作的。上一章......