构造以及乱搞以及atcoder专题

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

agc039A

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

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

agc039B

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

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

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

因为 ∑ i = 1 n ( a i + b i ) < = ∑ i = 1 n c i \sum_{i=1}^n (a_i + b_i) <= \sum_{i = 1}^n c_i i=1n(ai+bi)<=i=1nci
两边都加上 c i c_i ci,整理一下就可以得到一个充分条件 2 K < = N + 1 2K <= N + 1 2K<=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 − k 1 \ 2 \ 3 \ ... \ n - k 1 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 + 4 a, a + 1, a + 2, a + 4 a,a+1,a+2,a+4
其中 a a a是个奇数,那么显然这是合法的方案。
那么答案就是
1 , 2 , 3 , 5 1, 2, 3, 5 1,2,3,5
7 , 8 , 9 , 11 7, 8, 9, 11 7,8,9,11
13 , 14 , 15 , 17 13, 14, 15, 17 13,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 ( 3 6 4 ) O(36^4) O(364)

cf 439C

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

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

cf 430A

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

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

cf 415C

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

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

cf 401C

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

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

你可能感兴趣的:(构造/乱搞)