codeforces
文章平均质量分 87
codeforces题解
snowy2002
一个来自985的ACMer
展开
-
Codeforces Round #837 (Div. 2) A~F
对于两条竖线中出现一次m的情况,我们可以枚举m出现的位置然后上下扩展,得到每个m所属的区间后,再遍历这个区间判断中间的横是否全都是好点。出现奇数次可以用异或和不等于零代替,然后我们对于每一个数随机一个对应的值,这样只需要用主席树就能求得最小的出现次数为奇数的数字。对于两条竖线中不出现m的情况,我们可以直接通过双指针的方法得到区间,再判断中间的横线是否出现m的次数小于等于1次。即可,这样我们抽出树上的一条链的时候,只需要记录前驱和后继结点即可,另外用记忆化搜索可以很方便的的实现。的最长回文子序列的长度,则。原创 2022-12-15 04:40:17 · 513 阅读 · 0 评论 -
Codeforces Round #836 (Div. 2) A~E
表示这个格子里钟表的时刻可以是任意的,并且,你可以把每一行或者每一列的钟表的时刻同时改变一个相同的数字,问有多少种方法把可以任意调节的钟表调节完后,能够通过有限次操作使得所有的钟表的时间全部统一。,然后就是一个带边权的二分图染色问题,如果图中出现某个连通块不是好的,答案一定为0,否则,记好的连通块个数为cnt,答案就是。,我们把这样的连通块成为一个好的连通块,判断可以通过类似二分图染色的方法实现,可以将第一个点赋值为。之前的位置已经是最优的,所以只需要考虑之后的数值,我们每次只需要找到。原创 2022-12-10 20:33:08 · 407 阅读 · 0 评论 -
Codeforces Round #777 (Div. 2)
挺有意思的一场比赛,T2最优解法属实没想到,T4少考虑了一种情况,蓝名差点掉没了B.Madoka and the Elegant Gift题目大意:给定一个01矩阵,判断其所有1的连通块是否都是完整矩形。分析:我的想法是求出每个1的连通块所属的最小矩形,然后判断这个矩形是不是全1矩形,这样确实没毛病,但是貌似有些麻烦,下面看正解,只需要判断矩形中每个2*2小矩形中1的个数是否为3即可。#include <bits/stdc++.h>using namespace std;typede原创 2022-03-13 04:10:55 · 948 阅读 · 0 评论 -
Codeforces Round #775 (Div. 2)
C.Weird Sum题目大意:给你一个n∗mn*mn∗m的方格,每个格子上都有一个数字,求相同数字之间的曼哈顿距离之和。分析:我们考虑每一个数字内部对答案的贡献,不难发现贡献来源于横坐标和纵坐标两部分,而且两部分互不干涉,因此我们可以采用加法原理,对于一个数的某一坐标上的贡献,我们可以采用前缀和的思想来快速计算答案,具体来说,我们可以先计算这个数在这个坐标的总和记为tottottot总个数记为cntcntcnt,然后对于每一个数的坐标aia_iai,它与后面所有数的距离和即为(tot−∑j=1i−1原创 2022-03-09 03:24:39 · 327 阅读 · 0 评论 -
Codeforces Round #773 (Div. 2)
A. Hard Way题目大意:给你一个位于第一象限的三角形,问不能由x轴上的点沿直线达到的线段长度。首先要满足题意三角形一定得是个倒三角形,而且最上面的边必须平行与x轴,这样只需要输出这条边的长度即可。#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<algorithm>#include<map>#include&l原创 2022-02-24 02:57:42 · 221 阅读 · 0 评论 -
Codeforces Round #768 (Div. 2)
A. Min Max Swap题目大意:给定两个数列aaa,bbb长度均为n,每次可以交换ai和bia_i和b_iai和bi求交换后两数列中的最大值的乘积的最小值。有一个显而易见的结论,就是两个数列中一定有一个数列的最大值等于所有元素的最大值,那么我们就可以尽可能使另一个数列的最大值变小,我们不妨令b数列为最大值所在的数列,这样我们只需要使得a数列尽可能小,因此对于每一个iii,我们只需要将ai=min(ai,bi)a_i=min(a_i,b_i)ai=min(ai,bi),bi=max(ai原创 2022-02-17 16:17:23 · 474 阅读 · 0 评论 -
Codeforces Round #771 (Div. 2)
A. Reverse题目大意:给定一个1~n的排列,求一次区间翻转后排列的最小字典序。我们要使字典序尽可能小,就要让尽可能靠前的数减小,因此我们只需要找到第一个a[i]≠ia[i]\neq ia[i]=i的位置即可,将此时的下标记为lll,然后再找出排列中iii对应的下标记为rrr,翻转区间[l,r][l,r][l,r]即可。#include<iostream>#include<cstring>#include<cstdio>#include<vec原创 2022-02-15 11:40:08 · 248 阅读 · 0 评论