这里面的题都来自于
atcoder
https://vjudge.net/contest/345563#overview
题意:每次给出一个字符串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(∣S∣2len+∣S∣4logk)的做法,先DP出以某个字母开头以及某个字母结尾的最小代价,然后快速幂即可。
题意:判断一个图是否是一个多段图,如果是的话,输出划分的最大的段
因为BFS的话,一定会把一个图划分成若干的段,而且从图的直径考虑,显然从某个点出发一定会get到答案,于是从每个点都出发BFS一遍就行。
因为 ∑ 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=1∑n(ai+bi)<=i=1∑nci
两边都加上 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;
}
题意:求一个排列,让相邻的数的差不为1
1 n 2 n − 1 3 n − 2... 1 \ n \ 2 \ n - 1 \ 3 \ n - 2... 1 n 2 n−1 3 n−2...这样即可,小数据特判
题意:有个屋子,有n个人依次进去,每次进去的时候需要和房间里面有空的人握手,任意时刻都可以让房间里面的三个人玩耍,他们就没有空了。给出每个人握手的次数,让你求一个可行的进屋子的顺序。
每次先找一条最长的递增的链,当走到最高的时候,这时候就只能组队了,每次贪心-3,然后走到最高的,重复下去即可。
题意:给出从左往右每个括号,右括号离左括号有多远,求一个合法的括号序列。
最开始没看到要求是有序的,于是就直接区间DP即可
题意:每次去掉一段数,问剩下的数的gcd
预处理前缀后缀gcd即可
题意:求一个排列,让相邻两个数的差只有k种。
分成两段,前面是 1 2 3 . . . n − k 1 \ 2 \ 3 \ ... \ n - k 1 2 3 ... n−k
然后下一个数再上一个数基础上不断地 + k +k +k, − ( k − 1 ) -(k-1) −(k−1), + ( k − 2 ) +(k-2) +(k−2)…即可
题意:让你搞出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
这样下去就行
题意:给你1到n这n个数,你可以每次选两个数进行+ - *,在n-1次后就只有1个数了,问那个数能不能是24,输出方案
其实因为1+2=3, 3-3=0,然后0乘任何数都是0,所以只要最后剩个4和6就行,然后4,5也是可以的,特判下就行。
…这也能出现在构造里面?傻逼题
题意:给你一个矩形,让你找4个不同的点(有序),让按顺序连成的线最长
直接爆搜边界的点就好了,可能是边界点±1,所以就是每次能选4个角附近的9个点,复杂度 O ( 3 6 4 ) O(36^4) O(364)
题意:给你n个数,让你分成 p p p组和为奇数, k − p k-p k−p组和为偶数
考虑到奇数+奇数为偶数,偶数+偶数为偶数,否则为奇数,那么肯定是优先选出 p p p个单独的奇数作为组,其他的组成偶数,组成偶数的时候要先把奇数之间相互结合。(其实写的时候坑有点小多)
题意:给你 n n n个点和 m m m个线段,让你给 n n n个点染成红色或者蓝色,让每个线段中红点和蓝点数量差为1.
其实红蓝红蓝这样就好了。(注意输入不是有序的x)
题意:让你构造n个数,使得每次取头部的两个数,把他们的gcd加起来,和为m
我的话先构造一个 m − n / 2 + 1 m - n / 2 + 1 m−n/2+1和这个数的两倍,然后剩下的填互质的数即可(这里可以直接筛质数,然后每次取质数和质数 + 1 +1 +1,这样就是互质的)
题意:给你 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即可