![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Codeforces
文章平均质量分 57
codefoeces好题
kaka0010
退役ACMer/算法竞赛菜鸡
展开
-
Codeforces Round #771 (Div. 2) A~E
目录A. ReverseOdd Swap SortC. Inversion GraphD. Big BrushE. Colorful OperationsA. Reverse给一个[1..n][1..n][1..n]的序列,可以翻转一次,求字典序最小只需要找到第一个与下标不同的数字,然后把这个数翻转到这个位置即可#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,i原创 2022-02-15 21:49:54 · 393 阅读 · 0 评论 -
Codeforces Round #764 (Div. 3)
目录A - Plus One on the SubsetB - Make APC - Division by Two and PermutationD - Palindromes ColoringE - Masha-forgetfulG - MinOr TreeA - Plus One on the Subset最大最小值之差#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod =原创 2022-01-11 14:56:19 · 430 阅读 · 0 评论 -
Codeforces Round #751 (Div. 2) ABCD
目录A. Two SubsequencesB. Divine ArrayC. Array EliminationD. Frog TravelerA. Two Subsequences直接找到最小的字符输出,然后把剩下的也输出#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int, int> pii;typedef unsigned long long ull;原创 2021-10-25 19:36:56 · 372 阅读 · 0 评论 -
Codeforces Round #750 (Div. 2) ABCDEF1
目录A. Luntik and ConcertsB. Luntik and SubsequencesC. Grandma Capa Knits a ScarfD. Vupsen, Pupsen and 0E. Pchelyonok and SegmentsF1. Korney Korneevich and XOR (easy version)A. Luntik and Concerts直接找规律,发现答案肯定只有01。模上1,2,3的公倍数,然后暴力枚举(a+c)%2#include <原创 2021-10-25 19:28:07 · 287 阅读 · 0 评论 -
Codeforces Round #595 (Div. 3) F. Maximum Weight Subset 树形dp
原题链接:https://codeforces.com/problemset/problem/1249/F目录题意分析Code题意有一颗树,每个节点都有权值,在树上选择距离大于k且选取集合权值和最大是多少。分析因为要选择大于k距离的点对,因此状态必须记录在子节点中距离大于j的最大权值,那么状态就可以直接出来了。我们设f[i][j]f[i][j]f[i][j]代表以i为根的子树中,距离大于j的最大权值。分类讨论一下j==0时,f[i][0]=a[i]+dp[v][k],v∈i的子节点j==0时原创 2021-07-14 09:37:30 · 64 阅读 · 0 评论 -
Codeforces Round #726 (Div. 2) F. Figure Fixing 二分图性质
原题链接:https://codeforces.ml/contest/1537/problem/F目录题意分析Code题意有一个n个节点m条边的图,每个点上都有权值ai,现在你可以对相邻点对同时加上或减去一个数,问是否能将所有ai变成理想的bi。分析我们先把改变值累加sum=∑∣bi−ci∣sum=\sum |bi-ci|sum=∑∣bi−ci∣,因为我们是对两个数同时操作的,因此sum只能同时加或减某个偶数。然后我们发现另一个关键性质,就是我们可以对奇数距离的点进行同加操作,对偶数距离的点进行一原创 2021-07-14 08:39:06 · 115 阅读 · 0 评论 -
Codeforces Round #457 (Div. 2) D. Jamie and To-do List 主席树
原题链接:https://codeforces.ml/contest/916/problem/D目录题意分析Code题意有四个操作set 将x的优先级修改为yremove 将x这个数移除query 查询有多少数小于x的优先级undo 撤销x次操作分析看到撤销操作应该就知道这是个主席树的题了,但撤销时需要维护两个信息,一个是相同优先级的数有几个,还有一个是当前这个数的优先级是多少,因此必须建两颗主席树,别的操作按照题意来就可以了,比较基础的主席树练习。太久没写主席了,手写错了一遍 ,下次原创 2021-05-04 23:29:58 · 100 阅读 · 0 评论 -
Educational Codeforces Round 108 (Rated for Div. 2) D. Maximum Sum of Products DP
原题链接:https://codeforces.ml/contest/1519/problem/D目录题意分析Code题意有序列a和序列b,你可以对序列a翻转一个区间,最后求∑l=1naibi的最大值\sum_{l=1}^{n}a_{i}b_{i}的最大值l=1∑naibi的最大值分析首先看复杂度,n是5e3的,因此可以用O(N2)O(N^2)O(N2)的算法,然后考虑怎么去翻转。如果用暴力,那么需要找到所有的区间也就是O(N2)O(N^2)O(N2)然后遍历一遍序列O(N)O(N)O(原创 2021-05-03 19:36:33 · 123 阅读 · 0 评论 -
Codeforces Round #717 (Div. 2) D. Cut 倍增
原题链接:https://codeforces.ml/contest/1516/problem/D目录题意分析Code题意给定一个n个元素的序列,每次询问一个区间[l,r],问区间内最少可以划分成多少块,使得块内的所有数互质分析首先所有数互质可以想到所有的质因子都不能相同,因此我们对每个数进行质因数分解并记录这些质因子最后出现的位置,然后再利用倍增的思想预处理出倍增数组记录每个位置往前跳的位置,这样复杂度可以控制在logn*m。查询的时候就一直暴力往前跳就可以,如果大于左端点,那么答案就加上跳过原创 2021-04-22 20:32:59 · 129 阅读 · 0 评论 -
Codeforces Round #214 (Div. 2) C. Dima and Salad 01背包变形
原题链接:https://codeforces.ml/problemset/problem/366/C目录题意分析Code题意有n件物品,每个物品有价值ai,有容量bi,问如何取使得取得物品的总价值是总容量的k倍,求出最大的价值分析转化一下题意,我么可以把容量*k,变成求∑ai=∑bi∗k\sum ai =\sum bi*k∑ai=∑bi∗k,移动一下式子变成bi=ai−bi∗kbi = ai-bi*kbi=ai−bi∗k,最后我们求∑bi\sum bi∑bi答案恰好是0时,最大的∑ai\sum原创 2021-04-13 16:55:09 · 121 阅读 · 0 评论 -
Codeforces Round #714 (Div. 2) D. GCD and MST 并查集+优化kruskal
原题链接:https://codeforces.ml/contest/1513/problem/D目录题意分析Code题意有n个点,每个点都有自己的权值ai两点之间的连边满足以下要求:gcd(ai,ai+1...aj)=min(ai,ai+1...aj)gcd(a_{i},a_{i+1}...a_{j})=min(a_{i},a_{i+1}...a_{j})gcd(ai,ai+1...aj)=min(ai,ai+1...aj) i和j可以连一条权值为min(ai,ai+1...aj)原创 2021-04-12 13:13:23 · 153 阅读 · 0 评论 -
Educational Codeforces Round 80 D. Minimax Problem 二分答案+状压
原题链接:https://codeforces.ml/contest/1288/problem/D题意有一个n个序列,每个序列的长度为m,我们可以任意取两个序列得到bi=max(aik,ajk)bi = max(a_{ik},a_{jk})bi=max(aik,ajk),答案求min(bi),i∈[1,m]min(bi),i∈[1,m]min(bi),i∈[1,m],求最大的答案输出选择的序列号分析题目看起来有点绕,仔细分析一下,求最小值的最大值,二分答案!然后看数据范围,n∈[1,3∗105原创 2021-04-13 16:17:52 · 92 阅读 · 0 评论 -
Codeforces Round #146 (Div. 1) E. Number Challenge 莫比乌斯反演
原题链接:https://codeforces.ml/contest/235/problem/E目录题意化简Code题意∑i=1a∑j=1b∑k=1cd(ijk)\sum_{i=1}^{a}\sum_{j=1}^{b}\sum_{k=1}^{c}d(ijk)i=1∑aj=1∑bk=1∑cd(ijk)d(n)代表n的因子个数d(n)代表n的因子个数d(n)代表n的因子个数化简已知结论d(ij)=∑x∣i∑y∣j[gcd(x,y)=1]已知结论d(ij)=\sum_{x|i}\sum_{y|j原创 2021-03-29 14:50:18 · 174 阅读 · 3 评论 -
Codeforces Round #684 (Div. 2) E. Greedy Shopping 线段树+暴力剪枝
原题链接:https://codeforces.ml/contest/1440/problem/E目录题意分析Code题意有一个不递增的序列,有两个操作x y 表示对[1, x]的元素取max(a[i], y)x y 表示你有y元钱,对[x, n]的元素有序买东西,能买就买,输出购买的数量分析因为操作是对[1,x]取max,因此不论怎么操作数列仍然是不递增的,这是关键的题意转化,对于操作1的实现,我们记一个懒惰标记就可以轻松解决了。对于操作2来说,我们要从左往右取,因此需要一些剪枝的技巧原创 2021-03-26 11:06:22 · 113 阅读 · 0 评论 -
Educational Codeforces Round 23 F. MEX Queries 线段树+离散化
原题链接:https://codeforces.ml/problemset/problem/817/F题意最开始有一个空集合和一个序列,有三种操作l, r 将序列[l,r]之间的未出现数加入集合中,不重复l, r 将序列[l,r]之间的出现数从集合中删除l, r 将序列[l,r]之间未出现的数加入集合,并且将出现的数从集合中删除分析整个过程都可以用线段树来模拟:第一个操作实质就是将[l,r]区间覆盖成1,代表在集合中第二个操作实质就是将[l.r]区间覆盖成0,代表从集合中删除第三个原创 2021-03-25 14:27:08 · 116 阅读 · 0 评论 -
Codeforces Round #683 (Div. 2, by Meet IT) E. Xor Tree 字典树+分治
原题链接:https://codeforces.ml/contest/1447/problem/E目录题意分析Code题意有n个点,每个点都能与别的点有一条连边,当且仅当他们的异或值最小,问最小删除几个点能使原图变成一棵树分析因为是异或最小的两个点,因此这两个点按位拆分后一定是公共前缀最多的,如果我们放在一棵字典树中,那么同一棵子树内的点更有可能连线,因此如果一棵树的两个子树内都有超过2个点,那么这两棵子树之间一定是没有边的,这样就形成了森林而不是树,因此我们不能让这种情况出现,即一个点的两棵子树原创 2021-03-22 13:52:40 · 88 阅读 · 0 评论 -
Educational Codeforces Round 105 D. Dogeforces 并查集+思维
原题链接:https://codeforces.ml/contest/1494/problem/D目录题意分析Code题意给一个n*n的矩阵,每个位置值代表i和j的最近祖先的权值,树上父节点权值严格大于子节点,最后请你构造出整棵树。分析因为父节点严格大于子节点权值,因此我们可以按照权值顺序来考虑,权值越小也就是越接近叶子,所以我们从叶子开始考虑。同时我们为了构造出树,必须要记住所有相连的边。我们从下往上开始连,一开始是一个森林,所以我们用并查集维护这个节点目前的根节点是什么,然后合并森林的时候就原创 2021-03-03 19:49:44 · 162 阅读 · 1 评论 -
Codeforces Round #693 (Div. 3) G - Moving to the Capital 最短路+dp
原题链接:https://codeforces.ml/contest/1472/problem/G目录题意分析Code题意有n个点,m条单项边,每个点上有三个操作如果dis[u] < dis[v],可以直接从u到v,可以进行无限次操作如果dis[u] >= dis[v],可以从u到v,只能操作一次待在u节点不动问从i节点出发能到距离1节点最近的距离是多少?分析如果直接建图,然后每个点上遍历一次肯定可以求出答案,但时间会超时,因此考虑记录已经遍历到的节点。先预处理一遍最短原创 2021-03-03 17:52:48 · 140 阅读 · 1 评论 -
Codeforces Round #704 (Div. 2) D - Genius‘s Gambit 思维+构造
原题链接:https://codeforces.ml/contest/1492/problem/D目录题意分析Code题意给出a个0和b个1组成两个二进制串x、y,要求满足:x - y 的二进制中1的个数为k个x大于yx和y都没有前导零分析这题有很多特判的细节,提前说一下。因为是x大于y,因此我们直接把x串设置成111…1000…的形式当a为0或b为1时,k只要不是0就输出NO当k=0时,直接输出YES然后就是构造的技巧,先假设一个串110000。我们先让x和y都设置为11原创 2021-02-23 22:08:45 · 201 阅读 · 0 评论 -
Codeforces Round #704 (Div. 2) C. Maximum width 贪心
原题链接:https://codeforces.ml/contest/1492/problem/C目录题意分析Code题意有s和t两个字符串,有一个序列p1,p2…pm满足spi = ti,现在求pi - pi-1的最大值分析因为一个ti可以对应多个位置,因此考虑贪心最优的策略。但要注意p是上升的序列,所以用双指针保证不减。正着走一遍可以算出每个ti位置可以取到的最小值,然后再倒着走一遍算出可以取到的最大值。那么最大的差值就是当前数的最大值减前一个数的最小值,再走一遍取max即可。Code原创 2021-02-23 20:39:40 · 197 阅读 · 0 评论 -
Codeforces Round #701 (Div. 2) D. Multiples and Power Differences 构造lcm
目录题意分析code题意给定一个n*m的原矩阵a,要求构造一个矩阵b满足每一位bij都是aij的倍数bij <= 1e6bij与相邻元素之差为k4 (k>=1)分析因为所有的aij都是小于16的,因此完全可以构造一个数满足他是所有aij的倍数用lcm从1处理到16,最后的值也只有720720,满足第二个条件,这样处理完之后,第一个和第二个条件都已经满足了,先用lcm填满整个bij最后考虑第三个差值条件,既要满足倍数关系不能变,又要和周围的值构造出差,只能把自己的值加上当前a原创 2021-02-13 13:33:18 · 2115 阅读 · 1 评论 -
Codeforces Round #701 (Div. 2) C. Floor and Mod 整除分块
目录题意分析Code题意给一个数对(n, m),求出在a∈[1,n],b∈[1,m]中满足⌊\lfloor⌊ab\frac{a}{b}ba⌋\rfloor⌋ = a mod b的数对有多少个分析观察样例发现当a=b+1时肯定满足,然后接着往下推当b=2时a / b = 3 / 2 … 再往后⌊\lfloor⌊ab\frac{a}{b}ba⌋\rfloor⌋ 已经大于2了,因此不可能满足当b=3时a / b = 4 / 3, 8 / 3当b=4时a / b = 5 / 4, 9 / 4原创 2021-02-13 12:44:05 · 2603 阅读 · 5 评论 -
Codeforces Round #699 (Div. 2) D. AB Graph 思维+构造
https://codeforces.com/contest/1481/problem/D目录题意分析Code题意n个点组成的完全图,边权为a和b,你可以走m步,问是否有可能走出回文串分析首先考虑m为奇数的情况,如果两点间的两条边相同,那么肯定是回文串,如果不相同,形如aba也可以构成回文串接着考虑m为偶数,我们知道如果是偶数那么中间两个肯定是相同的,我们只要找到连着相同的两条边就可以。在三个点之间肯定能形成这种情况,可以自己模拟一下试试,因为是完全图,所以当n>=3时肯定可以构造出来的原创 2021-02-06 13:30:40 · 2794 阅读 · 3 评论 -
Educational Codeforces Round 103 (Rated for Div. 2) D. Journey 并查集
https://codeforces.com/contest/1476/problem/D目录题意分析Code题意有n+1个城市,和n条路,路由L和R表示往左走或者往右走,但路的方向不是固定的,每走一次所有的路就会改变一次方向,问从每个城市出发最多能到达的城市数量。分析数据是3e5,如果反着建边跑dfs肯定会超时,所以我们要思考O(n)的解决方案。我们发现如果要整个联通块都可达,那么LR一定是相间出现的,因此我们从联通块入手,将原字符串分成不同的联通块并计算联通块内的个数,然后分析一下城市两边的不原创 2021-01-30 20:14:01 · 190 阅读 · 1 评论 -
Codeforces Round #698 (Div. 2) D. Nezzar and Board 裴蜀定理
https://codeforces.ml/contest/1478/problem/D目录题意分析Code题意黑板上有n个数,你可以任选两个数x,y,然后将2x-y写到黑板上,问k是否能被写到黑板上分析我们将2x-y拆开来看一下,x+x-y相当于x这个数加上他和y的差值,那么我们可以处理出所有的差值。但数据范围是1e5如果用n2 处理肯定超时,但我们发现如果我们求出了a1,a2和a2,a3的差值也就相当于求出了a3,a1的差值(a3-a2+a2-a1=a3-a1)因此我们只要处理出n-1个差值就原创 2021-01-29 14:57:44 · 1296 阅读 · 1 评论 -
Codeforces Round #698 (Div. 2) E. Nezzar and Binary String 离线+线段树
https://codeforces.ml/contest/1478/problem/E目录题意分析Code题意给你两个01字符串,要求从第一个字符串转换成第二个字符串,并满足以下要求每次给定一个检查区间,要求这个区间内必须是单一的0或1你可以在检查之前偷偷修改严格小于区间一半的字符数如果可以转换成功输出YES,否则输出NO分析正难则反,我们可以考虑离线的做法,从最后的状态一步步推到最初的状态,因为从后往前方案是一定确定的。我们只需要统计当前区间内有多少个1和0,然后判断应该怎么去翻就可原创 2021-01-29 13:59:58 · 226 阅读 · 1 评论 -
Codeforces Round #697 (Div. 3) A ~ E
A - Odd Divisor判断一个数是否能被大于1的奇数整除首先排除所有的奇数,在偶数中通常能拆成2*n,如果n为奇数,那么就可以被奇数整除。如果要求没有奇数的因子,那么这个数一定是2n ,所以用log2函数来判断一下就可以了。#include <bits/stdc++.h>using namespace std;//#define ACM_LOCALconst int N = 1e5 + 10;const int M = 5e5 + 10;const int INF = 0原创 2021-01-26 02:12:35 · 260 阅读 · 1 评论 -
CF 891C Envy 最小生成树+可撤销并查集
原题链接文章目录题意分析AC Code题意给定n个定,m条边,接下来有k组询问,每次给定一个集合,问能否用这些集合的点构成MST。分析如果每次只问一条边,我们可以用树剖或树上倍增找到这条链上最大值再替换成询问的边,但现在询问为一个集合,因此问题复杂很多。关于kruskal有两个很有趣的定理定义wi为每一条边,对于任意wi,我们选择长度<wi的边构成的联通块是相同的定义最小生成树中边长为wi的边条数有ci条,对于所有的最小生成树来说,wi和ci都是相同的考虑离线的处理方法,我们把所原创 2020-12-18 14:09:10 · 330 阅读 · 1 评论 -
CF 1444C Team-Building 可撤销并查集+种类并查集判二分图
文章目录题意分析代码题意给定n个点,m条边,k个集合。每个点都属于自己的集合,每次取任意两个集合构成的子图,问是否是二分图,最后求二分子图的个数。分析根据题目的数据范围,暴力枚举子图加dfs判二分图是肯定会超时的,因此考虑另一种判二分图的方法,种类并查集。种类并查集判二分图的方法:假设x和y分别处于二分图的两部分,那么我们建立两个点的虚点x+n和y+n代表对立面的点,因此从x和y+n是处于一个集合中的,y和x+n同理。最后如果发现x和y在一个集合中,说明存在奇环即不是二分图。然后我们考虑两个集合原创 2020-12-17 20:52:43 · 170 阅读 · 0 评论 -
CF 160D Edges in MST 最小生成树 + 割边
原题链接文章目录题意分析AC Code题意给定n个点和m条边,有三种情况这条边是最小生成树所必须的边这条边存在于不只一个最小生成树中这条边不包含在任何一个最小生成树中询问所有边的情况。分析如果一条边可以替换别的边成为最小生成树的边,那么它们的权值肯定是相同的,因此我们可以考虑所有权值相等的边。我们将这些边与当前连通块相连,如果存在一条边是桥,那么它一定是不可或缺的,所以答案记为any,否则为at least one。然后就是正常的最小生成树做法,如果这当前边的两个点都已经在连通块中了,原创 2020-12-20 20:09:10 · 287 阅读 · 0 评论 -
CF 1433G G. Reducing Delivery Cost 最短路+暴力枚举
原题链接文章目录题意分析AC Code题意有n个点和m条边的图,接着有k个询问,每次给定两个点ai和bi,问所有dis[ai][bi]之和。其中你可以指定一条边的代价为0。分析由于n的范围是1000,因此我们可以n^2log(m)的复杂度枚举出任意两点之间的距离。接着暴力去枚举边,如果设a,b这条边为0,那么我们考虑询问的两个点之间的距离怎么去计算。如果这条边不影响u,v之间的距离,那么距离还是dis[u][v],如果这条边对u,v之间的距离有影响,那么路径应该是min(dis[u][a] + d原创 2020-12-19 22:27:55 · 187 阅读 · 1 评论 -
CF 1242B B. 0-1 MST 补图连通块个数
原题链接文章目录题意分析AC Code题意图是有n个点组成的完全图,其中有m条边的权值为1,剩余权值为0,问将图连通的最小代价是多少。分析看题意就觉得是简单的生成树问题,但因为是完全图,因此没办法把所有边都存下来。因此我们考虑怎么去求补图的连通块,因为如果将边权为0的边全部用完,最后的代价就是剩余的连通块个数-1。我们可以用set来存边,再开一个set存点是否被遍历过,如果被遍历过则从set中删去,每次找下一个点时,只要当前点没有与下个点连边,即可以到达,因为是求补图,所以用set中的查询方法轻原创 2020-12-19 21:28:40 · 274 阅读 · 3 评论 -
CF 1436D Bandit in a City 树上贪心
原题链接文章目录题意分析AC Code题意给定一棵树形结构,每个点上都有一定的人数,人只能往叶子节点跑,根节点有一个土匪,问土匪最少能抓到多少人。分析我们只需要让所有的人均匀地跑到叶子节点就可以了,因此对于每个节点都有一个最优方案,也就是当前子树人数/当前子树叶子节点数+(人数%叶子节点 ? 1 : 0),最后取一个max就可以了,比较水的一道题。AC Code#include <bits/stdc++.h>#define ACM_LOCAL#define fi first原创 2020-12-19 09:47:06 · 188 阅读 · 1 评论