首页 > 其他分享 >「解题报告」Codeforces Round #884 (Div. 1 + Div. 2) Editorial

「解题报告」Codeforces Round #884 (Div. 1 + Div. 2) Editorial

时间:2023-07-12 11:34:21浏览次数:49  
标签:ch 884 yifan Codeforces while fg Div getchar

比赛地址:Dashboard - Codeforces Round 884 (Div. 1 + Div. 2) - Codeforces

个人评价:这场是构造专场!

A. Subtraction Game

Problem - A - Codeforces

有一堆石子(应该是石子),每次只能拿走 \(a\) 块或者 \(b\) 块,最先不能移动的人输,构造一个数 \(n\),使得先手必输。

两种构造方法:

  1. 构造一个数 \(n\) 小于 \(\min\{a, b\}\)。

  2. 构造一个数 \(n\),\((a + b) \le n \ < (a + b + \min\{a, b\})\)。

其实就是变相的 a + b

/*
  The code was written by yifan, and yifan is neutral!!!
 */

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

template<typename T>
inline T read() {
	T x = 0;
	bool fg = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		fg |= (ch == '-');
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	return fg ? ~x + 1 : x;
}

int T;

void solve() {
	ll a = read<ll>(), b = read<ll>();
	cout << a + b << '\n';
}

int main() {
	T = read<int>();
	while (T --) {
		solve();
	}
	return 0;
}

B. Permutations & Primes

Problem - B - Codeforces

给定一个整数 \(n\),要求构造一个 \(1 \sim n\) 的排列,使得这个排列的素数值最大

素数值定义:若一个子区间的 \(\operatorname{mex}\) 是一个质数,那么素数值加一。

\(\operatorname{mex}\):一个区间中最小的没有出现的非负整数,但在本题中不讨论 \(0\),因此在本题中的含义是最小的没有出现的正整数。

构造方法:

  1. \(1\) 放在中间。如果一个区间不包括 \(1\),那么这个区间对素数值的贡献为 \(0\),想让贡献最大,\(1\) 放在中间。

  2. 第一个位置放 \(2\),最后一个位置放 \(3\)。只要包括 \(1, 2\),但不包括 \(3\),则 \(\operatorname{mex} = 3\),是质数;包括 \(1, 3\),但不包括 \(2\),则 \(\operatorname{mex} = 2\),也是质数;当同时包括 \(1, 2, 3\) 时,区间长度为 \(n\),即 \(\operatorname{mex} = n + 1\),对于所有的排列,都会有这个最大的区间,因此就可以不考虑它,即可以不考虑同时包括 \(1, 2, 3\) 的情况。

  3. 剩下的空位随便排

/*
  The code was written by yifan, and yifan is neutral!!!
 */

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

template<typename T>
inline T read() {
	T x = 0;
	bool fg = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		fg |= (ch == '-');
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	return fg ? ~x + 1 : x;
}

const int N = 2e5 + 5;

int T;
int ans[N];

void work() {
	int n = read<int>();
	for (int i = 1; i <= n; ++ i) {
		ans[i] = 0;
	}
	ans[1] = 2, ans[n] = 3, ans[n / 2 + 1] = 1;
    // 这里这样写就不用特判 1 的情况了
	for (int i = 2, k = 4; i < n; ++ i) {
		if (!ans[i]) {
			ans[i] = k;
			++ k;
		}
	}
	for (int i = 1; i <= n; ++ i) {
		cout << ans[i] << " ";
	}
	putchar('\n');
}

int main() {
	T = read<int>();
	while (T --) {
		work();
	}
	return 0;
}

C. Particles

Problem - C - Codeforces

给定一个 \(n\) 个整数(可以为负)的序列,可以从中删掉某个位置的数,然后把这个位置的左右两边的数加在一起,合成一个新的元素(两个元素合为一个,数量也减一),如果左右元素为空,就不合并。按此操作直到最后只剩一个数,求最大可能的数。

将奇数位置的数和偶数位置的数各自提取出来,可以发现,只有奇数位置的数能与奇数位置的数合并,同理,也只有偶数位置的数可以和偶数位置的数合并(后面简称奇数集和偶数集),即最后的答案一定为奇数集的和或偶数集的和。

对于负数的情况,我们总可以将负数都删去,如果存在一个负数删掉后左右两边出现了一个正数或一个负数,那么一定会使奇数集或偶数集的答案减小,至于让哪个集的和减小,哪个集的和成为答案的可能性小,就让哪个集的和减小。

对于全是负数的极端情况,输出序列的最大值即可。

/*
  The code was written by yifan, and yifan is neutral!!!
 */

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

template<typename T>
inline T read() {
	T x = 0;
	bool fg = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		fg |= (ch == '-');
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	return fg ? ~x + 1 : x;
}

const int N = 2e5 + 5;

int n;
int a[N];

void solve() {
	n = read<int>();
	bool fg = 1;
	ll ans1 = 0, ans2 = 0;
	for (int i = 1; i <= n; ++ i) {
		a[i] = read<int>();
		fg &= (a[i] < 0);
	}
	if (fg) {
		cout << *max_element(a + 1, a + n + 1) << '\n';
		return ;
	}
	for (int i = 1; i <= n; ++ i) {
		if (i & 1) {
			ans1 += max(a[i], 0);
		}
		else {
			ans2 += max(a[i], 0);
		}
	}
	cout << max(ans1, ans2) << '\n';
	return ;
}

int main() {
	int T = read<int>();
	while (T --) {
		solve();
	}
	return 0;
}

D. Row Major

Problem - D - Codeforces

非正解 暴力跑过去了?

构造一个字符串,长度为 \(n\),该字符串可以一次转化成一个 \(r \times c\) 的矩阵(即 \(r \times c = n\)),是的矩阵中相邻元素相等的情况最少。

首先,在序列中相邻的元素不能相同,之后枚举 \(n\) 的因数,判断矩阵中上下相邻的元素是否相同即可。

/*
  The code was written by yifan, and yifan is neutral!!!
 */

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

template<typename T>
inline T read() {
	T x = 0;
	bool fg = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		fg |= (ch == '-');
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	return fg ? ~x + 1 : x;
}

const int N = 1e6 + 5;

vector<int> y;
char s[N];
bool vis[127];

void solve() {
	y.clear();
	memset(s, '\0', sizeof s);
	int n = read<int>();
	int lim = sqrt(n);
	for (int i = 2; i <= lim; ++ i) {
		if (n % i == 0) {
			y.emplace_back(i);
			y.emplace_back(n / i);
		}
	}
	s[1] = 'a';
	for (int i = 2; i <= n; ++ i) {
		for (int j = 'a'; j <= 'z'; ++ j) {
			vis[j] = 0;
		}
		int tmp = 'a';
		vis[(int)s[i - 1]] = 1;
		while (vis[tmp])	++ tmp;
		for (int j : y) {
			if (i - j <= 0)	continue ;
			vis[(int)s[i - j]] = 1;
			while (vis[tmp]) {
				++ tmp;
			}
			if (tmp > 'z')	tmp = 'z';
		}
		s[i] = tmp;
	}
	for (int i = 1; i <= n; ++ i) {
		putchar(s[i]);
	}
	putchar('\n');
}

int main() {
	int T = read<int>();
	while (T --) {
		solve();
	}
	return 0;
}

E 往后,题解就看不懂了,就不再补了。

标签:ch,884,yifan,Codeforces,while,fg,Div,getchar
From: https://www.cnblogs.com/yifan0305/p/17546652.html

相关文章

  • CodeForces Gym 102900B Mine Sweeper II
    CF传送门感觉像脑筋急转弯。考虑所有数字之和就是相邻的\((\text{雷},\text{空地})\)对数,因此翻转后这个对数不会改变。然后由于抽屉原理,\(b\toa\)和\(b\to\operatorname{inv}(a)\)中至少有一个操作次数\(\le\left\lfloor\frac{nm}{2}\right\rfloor\),然后就做完了......
  • UESTC 2023 Summer Training #02 Div.2
    Preface都给我丑完了这怎么办啊,被血虐了苦路西这场本来前面感觉都还可以,但是当中期看了眼C的题意后准备开C后就不对劲了起来最后1h扔掉一直T的C题去做H,结果因为被卡自然溢出的Hash一直挂到比赛结束,直接红温感觉这场策略问题挺大的,比如没有跟榜去写更加简单的E题(比赛的时候题......
  • Codeforces Round #771 (Div. 2) A-E
    A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intp[507];boolsolve(){intn;cin>>n;for(inti=1;i<=n;i++)cin>>p[i];intpos1=0,pos2=0;for(inti=1;i<=n;i++){......
  • CodeForces 1525F Goblins And Gnomes
    洛谷传送门CF传送门套路地,将DAG的最小不交路径覆盖转化为点数减去拆点以后最大匹配。感性理解就是一开始每个点都是一条路径,一个匹配意味着两条路径结合了。由题意知,第\(i\)次进攻时最小不交路径覆盖必须\(>i\),也就是说,设最大匹配为\(k\),那么\(n-k>i\),即\(k\le......
  • E. Two Chess Pieces -- (codeforces) 树形DP
    原题链接:https://codeforces.com/contest/1774/problem/E题意:两颗棋子,给出两颗棋子必须要去的顶点,且给出两颗棋子的相隔距离不能大于d,算出两颗棋子完成目标后走的距离。最后两颗棋子都要回到顶点1上。思路:刚开始没想出来,顺着官方题解写的,大意就是我用数组s1和s2代表两颗棋子......
  • JQuery 控制 Div 显示和隐藏
    页面上有两个Div用JQuery控制Div显示和隐藏。实现Div间切换的需求<divclass="IndConKHuansoverH"id="divExtTelList">11111111111111111111<div><divclass="IndConBflex"id="divExtTelStatus">22222222222222......
  • div小窗的拖动
    最近要做一个置顶聊天框的功能,想着要给他做成可以拖动的一开始使用的是@mousedown+@mousemove+@mouseup来进行小窗口的拖动,但是出现拖动的时候小窗会闪烁,并且位置距离也不好把控,效果不好。然后借鉴了网上大神的帖子,使用v-drage和directives对div进行拖动首先,在控件最外面的div......
  • CodeForces 1508C Complete the MST
    洛谷传送门AtCoder传送门比较需要观察的题。设\(v\)为所有边权异或和。直觉是设一条未确定权值的边边权为\(v\),其他的为\(0\)最优。证明大概就是讨论MST是否全部使用未确定权值的边。若全使用了,那么根据\(\oplusw\le\sumw\)可知\(\min\sumw=\oplusw\),并且......
  • 从零开始的知识图谱生活,构建一个百科知识图谱,完成基于Deepdive的知识抽取、基于ES的简
    从零开始的知识图谱生活,构建一个百科知识图谱,完成基于Deepdive的知识抽取、基于ES的简单语义搜索、基于REfO的简单KBQA个人入门知识图谱过程中的学习笔记,算是半教程类的,指引初学者对知识图谱的各个任务有一个初步的认识。目前暂无新增计划。1.简介目标是包含百度百科、互动百......
  • CodeForces 997C Sky Full of Stars
    洛谷传送门CF传送门考虑容斥,钦定\(i\)行\(j\)列放同一种颜色,其余任意。\(i=0\)或\(j=0\)的情况平凡,下面只考虑\(i,j\ne0\)的情况。答案为:\[\sum\limits_{i=1}^n\sum\limits_{j=1}^n(-1)^{i+j+1}\binom{n}{i}\binom{n}{j}3^{(n-i)(n-j)+1}......