首页 > 其他分享 >CodeForces 1379E Inverse Genealogy

CodeForces 1379E Inverse Genealogy

时间:2024-01-10 11:00:29浏览次数:21  
标签:typedef Inverse return puts int CodeForces long 1379E define

洛谷传送门

CF 传送门

\(n\) 为偶数显然无解。

否则我们可以构造一棵 \(n\) 个点的完全二叉树,当 \(n + 1\) 是 \(2\) 的幂时满足 \(m = 1\),否则 \(m = 0\)。

当 \(n \ge 5\) 时可以递归至 \((n - 2, m - 1)\),再挂一个叶子即可。

但是可能会出现 \(n + 1\) 不是 \(2\) 的幂,但 \(n - 1\) 是,可能会把有解判成无解。

打一个补丁,如果上面那种情况递归下去无解,当 \(n \ge 11\) 时我们可以接一棵 \(3\) 个点的满二叉树,然后再递归至 \((n - 4, m - 1)\)。

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

code
// Problem: E. Inverse Genealogy
// Contest: Codeforces - Codeforces Round 657 (Div. 2)
// URL: https://codeforces.com/problemset/problem/1379/E
// Memory Limit: 512 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 100100;

int n, m, a[maxn];

int dfs(int n, int m) {
	if (n <= 1 || m < 0) {
		return -1;
	}
	if ((m == 1 && (1 << (__lg(n) + 1)) != n + 1) || (m == 0 && (1 << (__lg(n) + 1)) == n + 1)) {
		for (int i = 2; i <= n; ++i) {
			a[i] = (i >> 1);
		}
		return 1;
	}
	int r = dfs(n - 2, m - 1);
	if (r != -1) {
		a[r] = a[n - 1] = n;
		return n;
	}
	if (n > 9) {
		a[n - 3] = a[n - 2] = n - 1;
		a[n - 1] = n;
		r = dfs(n - 4, m - 1);
		if (r == -1) {
			return -1;
		}
		a[r] = n;
		return n;
	}
	return -1;
}

void solve() {
	scanf("%d%d", &n, &m);
	if (n == 1) {
		if (m == 0) {
			puts("YES\n0");
		} else {
			puts("NO");
		}
		return;
	}
	if (n % 2 == 0 || m > (n - 3) / 2) {
		puts("NO");
		return;
	}
	if (dfs(n, m) == -1) {
		puts("NO");
		return;
	}
	puts("YES");
	for (int i = 1; i <= n; ++i) {
		printf("%d ", a[i]);
	}
	putchar('\n');
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,Inverse,return,puts,int,CodeForces,long,1379E,define
From: https://www.cnblogs.com/zltzlt-blog/p/17956066

相关文章

  • codeforces比赛(3):codeforces good_bye_2023
    A、2023跳转原题点击此:A题地址1、题目大意  在一个乘积可能等于2023的数组a中去掉了k个数,得到新的长度为n的b数列。请你输出k个数,使得这k个数与b数列相乘为2023.如果不存在则输出No。2、题目解析  因为这道题的n和k都是不超过5,所以我们只需要算出b数组的乘积是否是2023的......
  • Codeforces Round 918 (Div. 4) (前缀和,权值树状数组,二维偏序, python + golang)
    Dashboard-CodeforcesRound918(Div.4)-Codeforces  fromcollectionsimport*defsolve():a,b,c=list(map(int,input().split()))hs=defaultdict(int)hs[a]+=1hs[b]+=1hs[c]+=1foriinhs:ifhs[i]=......
  • [Codeforces] CF1545A AquaMoon and Strange Sort
    CF1545AAquaMoonandStrangeSort题目传送门题意有\(n\)个人从左到右站成一排,从左数第\(i\)个人的衣服上印着\(a_i\)。每个人的朝向可以是朝左、朝右。一开始所有人的方向都是朝右。您可以对这些人做一些“操作”,每次操作允许您找两个相邻的人让他们交换顺序,但是在操作......
  • [Codeforces] CF1547E Air Conditioners
    CF1547EAirConditioners题目传送门这道题我的思路严重劣于题解思路,所以请慎用但是自认为我的贪心比dp好理解点题意有\(q\)组数据,每组第一排表示有\(n\)个方格和\(k\)个空调,第二排是每个空调的位置\(a_i\),第三排是每个空调的温度\(t_i\)。每个空调对周围的影响......
  • codeforces刷题(1100):1862C_div3
    C、FlowerCityFence跳转原题点击此:该题地址1、题目大意  给你n块长度依次不递增的紧密连接在一起的垂直木板,将它们水平横过来,问其组成的全新n块木板的长度是否与原来的木板长度一致。  注意:这里的长度是指:木板的高度。水平摆放后的木板是左对齐,所以其长度就是各个木板水......
  • codeforces刷题(1100):1863B_div1+div2
    B、SplitSort跳转原题点击此:该题地址1、题目大意  给定一个长度为n的排列(该排列的数字是包含\(1\simn\),每个数必须出现一次)。你可以执行以下操作:  选中一个数x,比x小的数按照原来的顺序放在x的左边,大于等于x的数按照原来的顺序放在x的右边。问你将原始排列组成\(a_i==......
  • codeforces刷题(1100):1863C_div1+div2
    C、MEXRepetition跳转原题点击此:该题地址1、题目大意  给定一个数组,要求每次依次从左到右将\(a_i\)替换为当前数组的最小非负整数(每次替换一个数后,最小非负整数也会发生改变)。问你,经过k次的操作后,最终数组是什么。  注意:该数组的数和最小非负整数,是从\(0,1,\cdots,n\)......
  • Codeforces Round 918 (Div
    CodeforcesRound918(Div.4)这是本人打的第一把div4,比赛中AC到了E,算是打cf以来这一个多月的最成绩了,但是div4似乎只有EFG较难,ABC签到题,D是div3签到题。A.OddOneOut判断就行#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while......
  • codeforces刷题(1100):1864B_div1+div2
    B、SwapandReverse跳转原题点击此:该题地址1、题目大意  给你一个字符串和k,你可以对该字符串做一下两个操作:交换\(a_i\)和\(a_{i+2}\)的字符;对\([i,i+k-1]\)这个区间的字符就行反转;问你通过这两个操作后,原字符串所能生成新的字典序最小的字符串是什么。2、题目解......
  • Codeforces 1876G Clubstep.md
    首先考虑暴力的贪心。从\(r\)到\(l\)依次遍历,若\(a_i<x\)则一直进行题目中的操作。正确性是能保证的,因为选后面的\(j\)只能\(+1\),而选\(i\)可以\(+2\),且\(i\)前面的部分都是\(+1\)。考虑转化一下,把对\(i\)进行操作\(k\)次后,\(\forallj\in[1,i),a_j\l......