![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
codeforces
biuhongWA
XMU电科院研一学生
展开
-
Educational Codeforces Round 99 (Rated for Div. 2) A-D题解
题目链接:https://codeforces.ml/contest/1455tip:有一段时间div2没做出四题了,记录一下(D题差点没改对QAQ)。A、Strange Functions输出输入的字符串长度即可,签到题。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=5e5+10; int main(){ int T;cin>>T;原创 2020-12-01 10:45:32 · 424 阅读 · 0 评论 -
Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree(DFS+贪心)
题目链接:https://codeforces.ml/contest/1401/problem/D题意:n个点,n-1条边,一个数k拆分成若干个素因数将其放置在边上,f(i,j)表示从i顶点到j顶点的边权和,求的最大值。题解:很明显的贪心题,边经过的次数越多,放置的数字越大,因此要先求出每条边经过的次数再从大到小排序,最后分n和m的关系讨论,重点在于如何求每条边的次数,开一个数组sz表示子树大小(节点数),经过边的次数=(n-sz[i])*sz[i],这边简单证明一下,我们从树种任意选取一条边,原创 2020-08-22 03:36:03 · 114 阅读 · 0 评论 -
Codeforces Round #661 (Div. 3) D. Binary String To Subsequences(队列)
题目链接:https://codeforces.ml/contest/1399/problem/D题意:给一串由0和1组成的字符串,问最少可以分成多少个子序列使得每个子序列没有相邻的0和1.题解:直接模拟标号,同时需要两个队列,q0存的是以0结尾的标号,q1存的是以1结尾的标号,若当前s[i]='0'判断q1是否为空,非空则该元素的标号=队首的标号,再将队首弹出放入q0队列(此标号从以1结尾变成了以0结尾),反之亦然。代码:#include<bits/stdc++.h>usi原创 2020-08-06 15:46:27 · 116 阅读 · 0 评论 -
Codeforces Round #660 (Div. 2) C、D
C. Uncle Bogdan and Country Happiness(两次dfs)题目链接:https://codeforces.ml/contest/1388/problem/C题意:给定一个n个节点的树,所有人都从1号节点往自己回家的方向走,在走的过程中每个人的好心情可能会变成坏心情,但坏心情不能变成好心情,pi是每个节点居住的人数,hi当前节点是好心情的人数-坏心情的人数,问hi计数是否存在。题解:首先要把所有节点经过的总人数算出来(第一次dfs),从而算出每个节点好心情的人数,再将原创 2020-07-31 14:37:22 · 132 阅读 · 0 评论 -
Codeforces Round #658 (Div. 2) D. Unmerge (01背包)
题目链接:https://codeforces.ml/contest/1382/problem/D题意:定义两个数组的合并merge(a,b),每次将数组a第一个元素和数组b第一个元素中最小的那个放到数组c中,同时删除那个最小的元素,现在给你一个长度为2*n的排列,问是否能由两个长度为n的数组合并而成。题解:通过观察可以发现这一段序列由若干个子段组成,例如3 1 2 4可以由3 1 2和 4组成,其分法是以最大值为分割点,可以简单的证明一下,若将一段中小的放到另一个数组b中,则该小的数必然排在大的.原创 2020-07-24 12:14:43 · 91 阅读 · 0 评论 -
Codeforces Round #656 (Div. 3) E. Directing Edges (拓扑排序)
题目链接:https://codeforces.ml/contest/1385/problem/E题解:首先将有向边和无向边分开存,若已存在的有向边(判断一个有向图是否存在环用拓扑排序)已经存在环则输出NO,否则一定有解,无向边方向的判断可以根据拓扑排序的先后次序,次序在前的指向次序在后的。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+10;int原创 2020-07-23 21:52:02 · 73 阅读 · 0 评论 -
Codeforces Round #652 (Div. 2) D. TediousLee (DP+找规律)
链接:https://codeforces.com/contest/1369/problem/D题解:如图,要注意f[3]!=f[2]+f[1]*2,因为level为3的时候算的是最上边的claw,为6的时候最大的也是算上最上边的claw,因此可以推出level是3的倍数时递推式就是f[i]=f[i-1]+f[i-2]*2+4。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const原创 2020-06-24 13:04:51 · 177 阅读 · 0 评论 -
Codeforces Round #651 (Div. 2) D. Odd-Even Subsequence (贪心+二分)
题目链接:https://codeforces.com/contest/1370/problem/Dsolution:原创 2020-06-21 19:35:43 · 127 阅读 · 0 评论 -
Codeforces Round #651 (Div. 2) E. Binary Subsequence Rotation(思维)
题目链接:https://codeforces.com/contest/1370/problem/Esolution:若s串中0和1的数量与t串中不同则直接输出-1,否则有解。有解的情况下只需要考虑不同的部分,不同的部分中s串为1则t串为0,经过模拟后会发现像111000,000111这种情况可以拆分成三个10或01串进行平移,而其它单独拆分出来的01串或10串可以与最长的111000串和000111串合并起来进行平移,101串的情况是不需要考虑的因为它经过平移不可能与t串相同。具体的实现看代码吧。原创 2020-06-21 19:23:13 · 134 阅读 · 1 评论 -
Codeforces Global Round 8 D. AND, OR and square sum(位运算+贪心)
题目链接:https://codeforces.com/contest/1368/problem/D题意:有n个数,每次可以选两个下标不同的数ai和aj,使得ai=ai|aj,aj=ai&aj,可以操作任意次,问操作后使得所有数最大的平方和是多少。solution:仔细观察发现ai=ai|aj和aj=ai&aj如果对应的位不一样则交换0和1的位置,并没有改变当前位0和1的数量。因此我们可以统计出每个位上1的个数,然后重新分配1,越前面的尽可能分配越多的1,这样使得平方和更大。时间复杂原创 2020-06-19 13:21:21 · 106 阅读 · 0 评论 -
矩阵消除游戏(二进制枚举+贪心)
题目链接:https://ac.nowcoder.com/acm/problem/200190题意:给n*m的矩阵,每次只能取一行或一列,取完后该行或该列变为0,总共能取k次,问怎么取才能使获得的数最大。思路:n和m都很小,可以想到枚举选出k个行和列,但是最坏的时间复杂度为2^30次方会T,因此可以想到如果只枚举行或列选取哪些,另一边直接贪心的从大到小选取就好了,但是如何枚举呢,这边要采用二进制的方式,1表示选中,0表示未选中。二进制枚举参考:https://blog.csdn.net/su原创 2020-06-10 22:07:15 · 516 阅读 · 0 评论 -
Codeforces Round #605 (Div. 3) D. Remove One Element (前缀和+后缀和|线性DP)
题目链接:https://codeforces.com/contest/1272/problem/D题意:给一个数列,最多移除其中一个数,问最长的连续上升子串的数量。tip:这篇博客写给自己看的。。算是翻翻旧题目吧,去年好像是WA了好多发没写出来,那时候还不会DP,现在看起来好像根本不需要DP的样子。思路:其实这题有两种情况,第一种是不删,第二种是删其中一个,连续上升的话可以用前缀和处理出来,再构造一个连续下降后缀和,因为连续上升从后往前就是连续连续下降嘛,删除某一个数其实只要将它前面一个数原创 2020-06-08 16:45:00 · 112 阅读 · 0 评论 -
Codeforces Round #648 (Div. 2) F. Swaps Again (思维+模拟)
题目链接:https://codeforces.com/contest/1365/problem/F题意:给你一个数组a,每次只能选取一个数K交换前缀的K个数和后缀的K个数,问是否能变成数组b。solution:先吐槽一下这题吧,个人觉得这题如果放在C题的位置都不过分。。然后说思路,先举个例子,1 2 3 4 5,可以变成5 2 3 4 1, 4 1 3 5 2, 2 1 3 5 4,多试几个样例发现对称的数经过交换后的位置依然是相对对称的,像这个例子中1和5,2和4的位置都是对称的,因此我们可以直原创 2020-06-08 11:40:17 · 326 阅读 · 1 评论 -
Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! D. Johnny and Contribution(图+贪心)
题目链接:https://codeforces.com/contest/1362/problem/D题意:给你N个顶点M条边,要给每一个顶点写上一个topic,写这个主题时要根据与该顶点相邻的点的topic中取最小的那个未写过的topic,并且相邻的点不能用相同的topic,问是否存在这样一个序列使得满足题目要求。思路:比较直接的想法就是从topic为1的优先填,因为前面的topic没填不可能去填后面的,它要基于相邻顶点的最小值的topic,因此我们可以贪心的从1到n去填,满足条件的是该顶点填上了b原创 2020-06-05 11:51:45 · 159 阅读 · 0 评论 -
Codeforces Round #646 (Div. 2) C. Game On Leaves (博弈)
题目链接:https://codeforces.com/contest/1363/problem/C题意:给一个无向图,两个人每次只能选取其中一个叶子节点拿走,谁先拿到题目给定的特殊节点就赢。思路:最简单的情况就是当特殊节点在叶子节点时先手直接赢,然后讨论当特殊节点是非叶子节点时,这时候双方采取的最优策略就是不让它成为叶子节点,因此一定会拿完其它节点再去拿特殊节点,这样问题就转化成了有n个数从一开始取数,谁先取到n就赢,所以跟n的奇偶是有关的,当n为奇数时先手赢,n为偶数时后手赢,这边只要算一下每个原创 2020-06-01 10:22:24 · 91 阅读 · 0 评论 -
Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task (枚举+最大子段和)
题目链接:https://codeforces.com/contest/1359/problem/D题解:这题与典型的求最大子段和相类似,但是多了一个要去除最大的值,再看题目中-30<=ai<=30,因此可以想到去枚举要移除的这个最大值,再通过求最大子段和求出连续区间和最大的值,对于所有的情况取max即可。这边补充一下最大子段和O(N)的求解方法吧,遍历一遍数组只要当和小于0时即可将sum置为0,因为它的贡献<0加上后面的肯定会变小,因此只要扫描一遍数组即可。代码:#incl原创 2020-05-30 19:51:51 · 101 阅读 · 0 评论 -
Codeforces Round #645 (Div. 2) D. The Best Vacation (二分+前缀和)
题目链接:https://codeforces.com/contest/1358/problem/D思路:题目中1≤x≤d1+d2+…+dn.因此他旅行的天数肯定不会超过一年,因此只需要在两年时间段的区间内去找最大的值即可,最关键的一点是这个答案一定是每个月的月末向前找,而不是向后,可以举一种很极端的例子,如果x=2而向后找的话那么下一个值是1肯定比向前找的小,因此只需要枚举每个月的月末,做两个前缀和,一个是总天数的前缀和,另一个是月份天数的前缀和,月份天数的前缀和数组可通过二分找到起始的月份,总天数.原创 2020-05-27 11:40:45 · 101 阅读 · 0 评论 -
Codeforces Round #644 (Div. 3) F. Spy-string (暴力)
题目链接:https://codeforces.com/contest/1360/problem/F题意:给你n个字符串,每个字符串长度为m,要求是否存在一个字符串使得该字符串与每个字符串的不同的字符个数小于等于1个。思路:看到n和m这么小,想到了暴力,但是发现如果dfs枚举字符串的每个字母的话复杂度最高为26^10次方,肯定会T,就算每个位置只枚举n个字符也是m^n次方,但是仔细一想会发现其实只要任意选取其中一个字符串,然后从枚举每个位置的字符,其它位置保持不变,因为答案的字符串一定是跟题中给定的原创 2020-05-25 02:00:21 · 145 阅读 · 0 评论 -
Codeforces Round #642 (Div. 3) D. Constructing the Array (优先队列)
https://codeforces.com/contest/1353/problem/D题意:给定一个长度为n的全0数组aa,每次进行以下操作直到所有元素均不为零:在第ii次操作中,取最长的全为0的一段子序列(优先取最左边的),令a[len2/2]=i。其中len为偶数,取l+rl+r或l+r−1。思路:首先题目中要求每次分区间时优先考虑长度最大且最左边的区间优先,因此比较容易想到用优先队列,这里我们将pair键值对放入优先队列中,第一个关键字存长度,第二个关键字存左端点,通过这两个关键词可以将右原创 2020-05-18 09:45:38 · 130 阅读 · 0 评论