![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Codeforces训练
cf补题
TURNINING
太蒻了
展开
-
E. Fair Share
Problem - 1634E - Codeforces思路:先考虑什么情况的时候无解:显然,当某个数字的总数为奇数时必定无解,那么当每个数的总数是偶数时是否一定有解呢?每行一共有偶数个数每个数出现偶数次我们考虑建下面这样的二分图,每行看成一个点aia_iai,每行的数字和aia_iai连无向边。这个图显然存在欧拉回路。在欧拉回路中我们令以aia_iai为出点的数字分到RRR,以aia_iai为入点的分到LLL。我们这样就能保证每个数组中的分到L,RL,RL,R的数量是一样的。因为无原创 2022-03-04 23:04:33 · 174 阅读 · 0 评论 -
2021 ICPC Southeastern Europe Regional Contest C. Werewolves
传送门思路:考虑对每个颜色分别进行计算。如果该节点的颜色为当前计算的颜色,令 vali=1val_i = 1vali=1,否则vali=−1val_i = -1vali=−1。显然要使子树颜色相同的数量严格大于一半等价于这个子树和大于等于1。求一个子树中和大于等于1的方案数,我们可以树上背包。定义:dp1[u][s]dp_1[u][s]dp1[u][s]: 以u为根的子树,和为s(s≥1)s(s\geq 1)s(s≥1)的方案数。dp2[u][s]dp_2[u][s]dp2[u][s]:和为−原创 2022-03-02 23:33:00 · 660 阅读 · 0 评论 -
Codeforces Round #717 (Div. 2) C. Baby Ehab Partitions Again
传送门这题想了半天怎么判断和为偶数时是否是好数组…我只能说01背包是在是太秀了。01背包:体积为v时所能取得的最大价值。当和为奇数时sum/2不存在。 ans = 0;当和为偶数时,通过01背包判断存在时, ans = 1;1,数组中存在奇数,则删掉这个奇数即可。2,不存在奇数,找到所有偶数的GCD,都除以一个GCD,此时必定存在一个奇数#include<bits/stdc++.h>using namespace std; typedef long long LL;原创 2021-04-22 20:14:09 · 117 阅读 · 0 评论 -
Educational Codeforces Round 109 (Rated for Div. 2) 1525D - Armchairs
传送门题意:给n个数字,每个数字为0或1,为1的必须向为0的转移,花费为两个数字的下标差。问所有1转移所需的最小花费。思路:看代码。具体怎么证明按递增的顺序匹配看官方题解吧,写的很详细了。#include<bits/stdc++.h>using namespace std;typedef long long LL;typedef pair<int, int> P;const int maxn = 5000 + 10;const int INF = 0x3f3f原创 2021-05-17 20:30:37 · 172 阅读 · 1 评论 -
Codeforces Round #661 (Div. 3) E2. Weights Division (hard version)
传送门题意:给你一颗带权树,现在定义 s = 根到所有叶子的路径和。现有S,你现在可以将每条边的权值 / 2,对不同的边进行除2操作有不同的费用(1或者2),现在求最小的花费,使s <= S。思路:第一印象是二分答案,但枚举答案并没有什么用。我们这样思考,最后的花费无非就是进行x次费用1的操作,y次费用2的操作,那么,我们可以事先计算好进行i次费用1操作所能减少的最大值,j次费用2操作所能减少的最大值,然后枚举其中一个的个数 另外一个可以用二分找到能满足要求的最小的次数。发现这种对结果只有两种原创 2021-07-20 10:08:14 · 83 阅读 · 0 评论 -
Codeforces Round #621 (Div. 1 + Div. 2) C. Cow and Message
传送门题目要求子串最大的数目是多少,且要求下标满足等差数列。(英语不好的我第一次写硬是没看出来那几个单词是等差数列的意思)很明显,当我们选择的字串长度为1 or 2时,我们不用考略等差数列的要求。当长度大于2时一定得先构建长度为2的字串且还要增加限制,所以数量一定会变小。#include<bits/stdc++.h>using namespace std; #define de(x) cout << #x << " == " << x <&l原创 2021-05-03 17:38:52 · 130 阅读 · 0 评论 -
Codeforces Round #716 (Div. 2) C. Product 1 Modulo N
传送门题意:一个序列1 到 n-1 从中找到最长的子序列使他们的乘积 mod n == 1;思路:我想的是找到最大的子序列乘积为 nk + 1,就是这个+1,我没有往深入想,显然 nk + 1 与 n 互质,所以我们要选择的元素必须与n互质。我们从头开始乘,如果最后结果 mod n == 1,结果就是这个序列,若不是,我们在乘的过程中跳过这个数,结果相当于是除了它本身,结果为1。#include<bits/stdc++.h>using namespace std; typede原创 2021-05-28 18:33:12 · 86 阅读 · 0 评论 -
Codeforces Round #717 (Div. 2) B. AGAGA XOOORRR (思维)
传送门让我们来考虑不同的情况:定义sum = a1 ^ a2 ^ a3 … ^an;if a1 = a2 = a3 … = an, n为奇数,sum == a1;if a1 = a2 = a3 … = an, n为偶数, sum == 0;所以当一个数组的sum==0时,必然满足条件。当sum != 0时,我们就找数组有多少个字串的sum == 原数组的sum,且数量为奇数个大于等于3;#include<bits/stdc++.h>using namespace std; t原创 2021-04-22 20:05:46 · 138 阅读 · 0 评论 -
Codeforces Global Round 14 C. Phoenix and Towers
传送门题意:有n个方块,每个方块有各自的高度且不大于x。把n个方块堆成m座塔,且要求任意两座塔之间的的高度差不能大于x。思路:每次取高度最小的塔,把当前方块堆上去。以下简单证明:假设现有的塔是合法的,我们给最低的塔加上一个不大于x的高度,它于原先倒数第二高的塔的距离必定小于等于x。因为他们俩原先的高度差最极限是一样高,加上一个x还是合法。当不一样高时,加上之后的高度差小于x,肯定合法。#include<bits/stdc++.h>using namespace std;typede原创 2021-05-15 19:16:12 · 112 阅读 · 0 评论 -
Dima and Salad
传送门题意:有n个物品,每个物品有两种属性aia_iai,bib_ibi,要求最大的∑imai\sum_i^{m}a_i∑imai且∑imai/∑imbi=k\sum_i^{m}a_i/\sum_i^{m}b_i = k∑imai/∑imbi=k;思路:把式子整理一下:∑imai−k∗∑imbi=0\sum_i^{m}a_i-k*\sum_i^{m}b_i = 0∑imai−k∗∑imbi=0 我们把每个物品对答案的贡献转换为$...原创 2021-07-31 22:01:10 · 174 阅读 · 0 评论 -
Codeforces Round #735 (Div. 2) (A-D)
传送门A . 思路:对于一个很大的数,区间越大最小的数是越小的,他们的乘积也就越小,所以枚举相邻两个数就行了。#include<bits/stdc++.h>using namespace std; #define lsn (u << 1)#define rsn (u << 1 | 1)#define mid (l + r >> 1) typedef long long ll;typedef unsigned long long ull;原创 2021-07-30 11:32:41 · 124 阅读 · 1 评论