构造以及乱搞以及atcoder专题

编程竞赛题解:atcoder与CF经典问题解析
本文汇总了多个来自atcoder和Codeforces的编程竞赛题目,包括字符串处理、图论、数学构造等多个主题。通过分析题意和提供解题思路,如agc039A的最小修改次数问题,cf 534D的贪心策略等,帮助读者理解和解决算法问题。

这里面的题都来自于
atcoder
https://vjudge.net/contest/345563#overview

agc039A

题意:每次给出一个字符串T,是由字符串S重复k次构成的,每次可以修改一个字符成为另一个,问你最小的修改次数使得每两个相邻字符都不相同。

其实只用O(len)O(len)O(len)扫一遍就好了,但是这里提供一个O(∣S∣2len+∣S∣4logk)O(|S|^2 len + |S|^4logk)O(S2len+S4logk)的做法,先DP出以某个字母开头以及某个字母结尾的最小代价,然后快速幂即可。

agc039B

题意:判断一个图是否是一个多段图,如果是的话,输出划分的最大的段

因为BFS的话,一定会把一个图划分成若干的段,而且从图的直径考虑,显然从某个点出发一定会get到答案,于是从每个点都出发BFS一遍就行。

第二回全国統一プログラミング王決定戦予選 E

因为∑i=1n(ai+bi)<=∑i=1nci\sum_{i=1}^n (a_i + b_i) <= \sum_{i = 1}^n c_ii=1n(ai+bi)<=i=1nci
两边都加上cic_ici,整理一下就可以得到一个充分条件2K<=N+12K <= N + 12K<=N+1
为了得到必要条件,可以考虑构造。
给出构造的代码x

	if (2 * K > n + 1) {
		puts("-1");
		return 0;
	}
	static bool vis[N];
	auto ans = vector<pair<pair<int, int>, int>>();
	int l = 0, r = n / 2 + n - (n % 2 == 0);
	if (l == r)
		++r;
	for (int i = K + 2 * n; i < K + 3 * n; ++i) {
		if (vis[l])
			++l;
		if (vis[r])
			++r;
		vis[l] = vis[r] = 1;
		ans.push_back({ { K + l, K + r }, i });
		l += 2, r--;
		if (l >= n)
			l -= n;
		if (r < n)
			r += n;
	}

cf 534A

题意:求一个排列,让相邻的数的差不为1

1 n 2 n−1 3 n−2...1 \ n \ 2 \ n - 1 \ 3 \ n - 2...1 n 2 n1 3 n2...这样即可,小数据特判

cf 534D

题意:有个屋子,有n个人依次进去,每次进去的时候需要和房间里面有空的人握手,任意时刻都可以让房间里面的三个人玩耍,他们就没有空了。给出每个人握手的次数,让你求一个可行的进屋子的顺序。

每次先找一条最长的递增的链,当走到最高的时候,这时候就只能组队了,每次贪心-3,然后走到最高的,重复下去即可。

cf 508E

题意:给出从左往右每个括号,右括号离左括号有多远,求一个合法的括号序列。

最开始没看到要求是有序的,于是就直接区间DP即可

CodeChef GCDQ

题意:每次去掉一段数,问剩下的数的gcd

预处理前缀后缀gcd即可

cf 482A

题意:求一个排列,让相邻两个数的差只有k种。

分成两段,前面是1 2 3 ... n−k1 \ 2 \ 3 \ ... \ n - k1 2 3 ... nk
然后下一个数再上一个数基础上不断地+k+k+k, −(k−1)-(k-1)(k1),+(k−2)+(k-2)+(k2)…即可

cf 477B

题意:让你搞出n个四元组,使得每个四元组内的数两两的gcd为k

显然可以先把k提出来,然后就变成找n个四元组,里面的数两两互质。这个的话,考虑
a,a+1,a+2,a+4a, a + 1, a + 2, a + 4a,a+1,a+2,a+4
其中aaa是个奇数,那么显然这是合法的方案。
那么答案就是
1,2,3,51, 2, 3, 51,2,3,5
7,8,9,117, 8, 9, 117,8,9,11
13,14,15,1713, 14, 15, 1713,14,15,17
这样下去就行

cf 468A

题意:给你1到n这n个数,你可以每次选两个数进行+ - *,在n-1次后就只有1个数了,问那个数能不能是24,输出方案

其实因为1+2=3, 3-3=0,然后0乘任何数都是0,所以只要最后剩个4和6就行,然后4,5也是可以的,特判下就行。

cf 459C

…这也能出现在构造里面?傻逼题

cf 452B

题意:给你一个矩形,让你找4个不同的点(有序),让按顺序连成的线最长

直接爆搜边界的点就好了,可能是边界点±1,所以就是每次能选4个角附近的9个点,复杂度O(364)O(36^4)O(364)

cf 439C

题意:给你n个数,让你分成ppp组和为奇数,k−pk-pkp组和为偶数

考虑到奇数+奇数为偶数,偶数+偶数为偶数,否则为奇数,那么肯定是优先选出ppp个单独的奇数作为组,其他的组成偶数,组成偶数的时候要先把奇数之间相互结合。(其实写的时候坑有点小多)

cf 430A

题意:给你nnn个点和mmm个线段,让你给nnn个点染成红色或者蓝色,让每个线段中红点和蓝点数量差为1.

其实红蓝红蓝这样就好了。(注意输入不是有序的x)

cf 415C

题意:让你构造n个数,使得每次取头部的两个数,把他们的gcd加起来,和为m

我的话先构造一个m−n/2+1m - n / 2 + 1mn/2+1和这个数的两倍,然后剩下的填互质的数即可(这里可以直接筛质数,然后每次取质数和质数+1+1+1,这样就是互质的)

cf 401C

题意:给你nnn个1,mmm个0,让你构造一个01串满足,连续的0的个数不超过2,连续1的个数不超过3

特判n=m+1n=m+1n=m+1的情况,其余的,先用110填(注意这里填的个数少弥补2个1留到最后),再用10填,最后补1,判断补1的个数是否少于等于2即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值