codeforces题解
文章平均质量分 91
codeforces补题
as_sun
这个作者很懒,什么都没留下…
展开
-
Codeforces Round 931 (Div. 2)题解
思路:这里的操作是异或,所以我们从二进制的角度来考虑,显然只有两者二进制位不同的时候才需要改变,每一位上如果需要变,要么是0变1,要么是1变0,对于0变1,n实际上会变大,所以我们要找一个更高位1变0来和它同步变化,否则n^x>n,就不满足要求。所以我们可以先遍历它们二进制的每一位,然后标记一下每一位,如果是1变0,标记成1,如果是0变1标记成2,然后从小往大遍历,每次当一个标记为2的位需要改变的时候,我们就往前找到一个标记为1的位和它一起变,否则如果找不到就直接退出输出-1,如此便可解决。原创 2024-03-14 09:06:58 · 606 阅读 · 0 评论 -
Codeforces Round 933 (Div. 3)
这题实际上还可以用双指针来写,我们将b[]和c[]都排序,然后用一个指针从小开始扫描b[],另一个指针从大往小扫描c,对于b[i],我们找到了一个合适的位置c[j],那么i往后,则b[i]变大,那么c[j]就应该变小,所以两个指针之间都是单向的,所以可以用双指针来写。但是有一点要注意,首尾必须选,这个还是有点麻烦的,但是也还好,我们最开始的队列为空,那么第一个元素被放进去后,后面的元素都会用它来更新,保证末尾元素被选,那么我们直接取dp[m]即可,因为集合定义的时候就是dp[i]中i一定被选。原创 2024-03-13 10:19:40 · 1058 阅读 · 0 评论 -
Codeforces Round 932 (Div. 2)
如果弹出的是中间的值,那么就无所谓,反正本来所选的部分就不用连续,但是如果弹出了左右边界,那么我们维护的br-bl岂不是失效了,假设我们真的弹出了左右边界,那么当前的左边界应该是l+c,右边界应该是r-d,这个区间我们在设定左边界为l+c的时候会遍历到,而且因为区间缩小了,左右边界更近了,所以实际的br-bl可能会变小,这里用一个更大的值来表示,不会多算,但是却可以帮我们访问所有的情况。我们是可以枚举集合中的每个数的,那么能否通过枚举集合中的数,将不符合要求的点对的数量统计出来呢?求差成立的话有多少对呢?原创 2024-03-09 10:01:02 · 955 阅读 · 1 评论 -
Codeforces Round 929 (Div. 3)题解
但是可能因为太着急了,并没有仔细分析性质,一直改一直交一直wa,最后终于想着分析一下,这一分析就找到问题的关键了,对于这个二次函数,很显然最大值应该在u+1/2的时候取到,但是因为值都是整数,所以要么在u处取到最大值,要么在u+1处取到最大值,所以我们可以找最接近u的数,那么我们可以通过找到第一个大于u的值来实现,因为跑道长度都是正的,所以一定是单增的,可以用二分来查找。思路:这题有个很巧妙的地方,最多操作两次,因为原数组的和mod 3只有三种情况,0,1,2,如果是0,那么就不用操作;原创 2024-02-29 13:43:27 · 839 阅读 · 0 评论 -
Codeforces Round 887 (Div. 2)补题
然后来看下一位3,很显然,这里有一个大于0是加上前一个数得到的,那么这一位和自己以及后面的数加起来应该只有2个大于0的数,这两个数出自哪里实在不好确定,那么我们换个角度去看1,对于1来说,很显然它仅仅与第一个数的和是正的,那么我们就将它赋为-3,再往前推,9在第4位,上次删除了1,3,所以9往后推两位,9在第6位,删除了第5位,所以再往前推9在第7位,删除了6,再往前推,9在第8位,删除了7,再推,9在第9位。然后再来看2,很显然这里的2是和前面两个数,那么它与自己的和是负的,那么显然可以直接赋成-1.原创 2024-02-08 20:47:20 · 765 阅读 · 0 评论 -
Codeforces Round 923 (Div. 3)补题
显然非桥边可以连接两个集合,所以我们只需要将所有边按照边权从大到小排序,然后依次判断每条边是否能够连通两个不同的并查集,如果可以的话,那么就是桥,如果不可以那么我们就可以记录它,因为它是非桥边,因为我们按照边权从大到小排序,所以最后一个被记录的非桥边就是我们要找的边。另外我们在建边的时候,因为最开始一条边都没有,所以有一些非桥边会被当成桥边,但是由于我们是从大到小访问的所有边,所以每个简单循环中的最轻的那条边一定会被记录下来,因为这条边一定是这个循环中最后被加入的边,它的两个端点一定属于同一个集合。原创 2024-02-08 13:58:51 · 795 阅读 · 0 评论 -
Codeforces Round 888 (Div. 3)补题
所以可以用map将所有的出现的数及它的出现次数统计出来,然后遍历map,将小于等于n的数标记一下,同时在map中减掉一次,然后遍历n,找一找有几个数没被标记,同时计算出没被标记的数的和,如果是一个,那么直接输出yes,如果是两个,那么就看两个数的和是否在map中,如果大于两个,直接判否。一定要把题目看清楚。思路:这题没什么难度,就是小f与其他人的高度差要恰好是k的倍数,同时有两个限定条件,两人不能站在同一级台阶上,则不能与高度相同的人进行交谈,另外台阶总共m级,到第m级时就到终点了,所以倍数需要小于m。原创 2024-02-05 20:48:44 · 670 阅读 · 0 评论 -
Codeforces Round 891 (Div. 3)补题
思路:很显然,我们在选的时候如果当前位是大于5的数,后面有能让它变成6的数,它变了对前一位的贡献也还是1,所以没什么区别,如果是9的话,进位变成0,前一位加1,和直接从这一位进位区别不大,所以我们只需要找到第一个可以进位的地方操作一下即可,对了,记得往前累计,另外边界值的处理什么的也要注意一下,不然没注意越界的话会有特殊字符输出,但是本地编译器可能看不到。思路:很显然只有奇数+偶数=奇数,很显然偶数可以随便分,那么我们只需要统计奇数的个数,如果奇数的个数可以平均分进两堆,那么奇偶性就相同,否则就不同。原创 2024-02-04 13:16:30 · 641 阅读 · 0 评论 -
Educational Codeforces Round 153 (Rated for Div. 2)补题
思路:很容易发现,我们相当于是找以某个点结尾的单增序列的最长长度,如果长度等于2,那么很显然,B移动一次,轮到A,那么A此时不能移动,胜利,如果等于长度等于1,显然B直接胜利,如果长度大于2,那么B可以将芯片移动到倒数第二个位置,A移动一次,然后B胜利,所以只有长度为2的时候,是幸运位置,但是有一点比较麻烦的是,这题的数据范围是t是1e4,n是3e5,那么需要用线性的时间复杂度来解决。check函数检查凑出m需要补多少个硬币,肯定优先补价值k的花式硬币,如果差值小于k之后再补价值为1的花式硬币,原创 2024-02-03 13:56:05 · 390 阅读 · 0 评论 -
Codeforces Round 893 (Div. 2)补题
如图,显然c被删除后,a,b之间吃饼干的位置会发生改变,但是a之前和b之后的情况是不变的,因为只能删除一个,所以a,b是正常要吃饼干的,并不会影响这个区间之外的地方。)这道题有点像,都是要找到两个不相交的连续区间,不过一个是要找区间的最长长度,一个是要找区间中的最大和,本质上都是要处理出以某个点为端点的一段区间的某个值,这里的这道题涉及到一个很妙的优化思路,就是上面所写的将三层循环降至两层循环的过程,因为很显然在查找的过程中,j是单增的关系,那么我们就可以在遍历的时候实时更新,进而降低时间复杂度。原创 2024-02-01 16:29:14 · 923 阅读 · 0 评论 -
Codeforces Round 922 (Div. 2)补题
显然如果a,b在二进制的某一位相同,那么和x进行异或之后,还是相同的,所以没什么变化,那么我们要想最小化结果,肯定还是要从不同位入手,很明显如果一个为0,一个为1,那么如果是0作为被减数,那么就要从高位退1下来参与,所以我们肯定将最高位1在的那个数中二进制下为1,而另一个数二进制下为0的位置更改一下,另外第一个相异的位置不能改动,因为要从这里退位下来。因为每一个划分的合法位置实际在一个区间中找,那么显然要找最小值,那么就是区间找最小值的问题,然后有多个位置,所以联系到单调队列优化的dp问题。原创 2024-01-31 23:00:55 · 623 阅读 · 0 评论 -
Codeforces Round 894 (Div. 3)
举个例子,d=2,a=[3,2,5,4,6],那么如果选择看第一部电影,实际的获取的娱乐值就是3-(1-0)*2,如果看完第一部电影后再去看第三部电影,那么从第三部电影中获取的娱乐值就是5-(3-1)*d,如果只看这两部电影,那么总的娱乐值就是两者的和。另外注意可能会爆int。题目大意:现在需要制作n个不同类型的双球冰淇淋,已知{1,1,2}可以制作{1,1}和{1,2},两种类型的冰淇淋,{1,2}可以制作{1,2}一种类型的冰淇淋,{1}什么都不可以,{1,1}可以制作{1,1}一种类型的冰淇淋。原创 2024-01-30 17:53:45 · 93 阅读 · 0 评论 -
Codeforces Round 921 (Div. 2)补题
我们再换个角度想想,所有数的gcd与x有什么关系,显然也是x的因数,因为每个数相当于a*g,那么加起来就是(a+b+c+...)*g,所以g一定是x的因数,另外因为我们可以发现均分的时候gcd最大,剩下的时候,gcd只会越变越小,所以我们就在x/n的范围内找x的最大因数即可。这样一次循环就算出来了,但是,我在wa了几次后遇到了一个很奇怪的点,m*p的值需要预处理,否则就会wa,另外算p的时候,我们直接算n*(n-1)/2的mod-2次方得逆元,就不要拆开了。但是显然目前还剩下两层循环,还需要再优化。原创 2024-01-29 14:22:22 · 524 阅读 · 0 评论 -
Educational Codeforces Round 152 (Rated for Div. 2)补题
思路:这个题很显然有些区间是等价的,所以核心交换要判断据左端点最近的1的位置a和据右端点最近的0的位置b之间的关系,如果a<b,那么实际修改的就是区间[a,b],如果b<a,那么实际修改的就是区间[b,a],但是这个统计,我最开始想的是双指针遍历区间,显然超时,然后我就放弃这个思路去考虑扫描线了,但是这个扫描线可能做不了(当然也可能是我对扫描线不太熟练),然后这个题实际上是通过加了一个预处理来解决的。我们假设已经分好块了,首元素如果为0,那么只能用后面的块来染色,如果首元素非0,那么就可以用它来染后面的。原创 2024-01-25 11:07:58 · 781 阅读 · 0 评论 -
Codeforces Round 889 (Div. 2)补题
那么如何找位置k呢,实际上用a[i]开到的位置应该是最后一个位置+a[i]得到的位置,但是我们如果要直接获取这个位置是很麻烦的,这里的处理就是折中一下,将所有已经解锁的位置都加上a[i]更新一个位置,由于是非负数,所以求和的话后面的一定大于等于前面的,那么实际更新到的位置最远,故而也是最大的,所以不会影响结果。另外要注意,因为我们的a[i]是从前往后遍历的,每次是将dp整体左移a[i],所以后面的a[i],实际上前面定下来的状态不能再由于它而往前更新,就像上面那个循环中,j要从i开始枚举。原创 2024-01-24 16:42:48 · 945 阅读 · 0 评论 -
Codeforces Round 892 (Div. 2)补题
思路:显然,如果一个数组能够输出第二小的数,那么肯定比输出第一小的数要好,然后我们移走一个数组中最小的数后就可以实现输出第二小的数,但是这些被移走的数肯定得有一个地方放,而且最小的数无论被移到哪里都是会被输出的。w[i-x+1,i]表示从从i往前延伸长度为x的区间得到的价值,dp[i-x][j-x]表示从前i-x中选,消耗j-x个长度得到的最大值,至于x的长度,我们可以暴力枚举来做。选第i个点:dp[i][j]=max(dp[i-x][j-x]+w[i-x+1,i])原创 2024-01-22 18:33:15 · 789 阅读 · 0 评论 -
Educational Codeforces Round 154 (Rated for Div. 2)补题
因为在查询之前,我们添加数可能有很多种情况,所以我们把它视为自由状态,数组一旦有序,那么有序部分就始终有序除非全部弹出,那么我们就可以用一个变量来表示它至少到第几位还是有序的,在查询单减状态时,如果它最少的有序位数等于数组长度或者当前数组长度小于2,那么肯定需要判否。所以最关键的点在于想到前缀的单减可以凑出来。我们根据这个来看,可以左边区间稍短一点右边区间稍长一点,然后两者中间的全部相等,这样就能实现,所以,我们分别记录两者的另一端点可能出现的位置,然后暴力组合,找出合法组合,如果没有那么就判否即可。原创 2024-01-21 12:21:43 · 853 阅读 · 0 评论 -
Codeforces Round 895 (Div. 3)补题
思路:这题又涉及到区间修改,又涉及到区间查询,所以很容易想到用线段树来做,但是这只是场div3,而且才到E题,还用不了这么高级的数据结构,我们再来看看有没有什么规律,我们最后想要的是什么,想要的只是两个值,我们用x1和x0来表示,而这题的难点在于如何在区间被修改之后更新这两个值,我们来看看修改前后的区别,如果s[i]的这个位置为1,那么在修改之前会出现在x1中,不会出现在x0中,修改之后不会出现在x1中,但会出现在x0中,所以x1的变化是a[i],x0的变化是a[i],然后这里的a[i]实际上是一段区间。原创 2024-01-20 12:40:30 · 803 阅读 · 0 评论 -
Educational Codeforces Round 161 (Rated for Div. 2)补题
再次遍历时,就只访问这些元素。思路:这题的考点就在于什么时候出现题目要求的情况,只要有一位满足,哪怕剩下的不满足也无所谓,那么就要看a[i],b[i],c[i]的关系,如果a[i]=b[i]=c[i],那么这一位能与a,b匹配就一定能与c匹配,如果a[i]=b[i]!然后从小到大访问,对于每种长度,如果大于等于2才有讨论的价值,选出两条当前长度的边,假设当前长度的有k条边,那么这两条边的选择的情况就有(k-1)*k/2,然后第三条边的选择为前c条边的总个数+(k-2),那么遍历map就能统计出来。原创 2024-01-19 13:36:04 · 999 阅读 · 0 评论 -
Codeforces Round 896 (Div. 2)补题
思路:这道题求mex的过程实际很简单,很容易发现,m>n的时候,mex的值就取决于行数,有多少行就有多少个0,那么我们就可以将这些0,尽可能地分散,那么就可以产生0-n这么多个mex值,最后总的mex就是n+1,如果m<=n,那么我们可以将m个数尽可能地分散,那么就前m-1行尽可能分散,后面地每一列都填一样的数,而且与第m-1行相同,那么m列就可以产生0-m-1个mex值,最后的结果就是m。当然有一个特例,m=1的时候,我们只有数字0可以填,那么这一列的mex是1,最后结果的mex是0。原创 2024-01-18 13:50:17 · 959 阅读 · 0 评论 -
Codeforces Round 897 (Div. 2)补题
思路显然可以,但是我们遇到环了肯定要判断退出,那么就要标记一下,比如我们从1开始遍历,那么遍历结束会是在第二次访问到5的时候,然后,我们再从2开始遍历,如果将之前打的标记全部清干净,3到1之后,再继续,然后又是到5结束,那么此时记录的长度就是6,而非是3,判断不是特别方便,而且清标记的过程时间复杂度是O(n),嵌套在遍历的O(n)循环中,那么就是O(n^2)是会超时的。所以我们标记不能清,那么遍历的1就会截至,此时的长度虽然是3,但是不成环,如果以长度作为判断标准,那么前面的那个循环长度为4,就不合适。原创 2024-01-17 14:52:32 · 815 阅读 · 0 评论 -
Hello 2024补题
假设现在已经有若干个系统了,然后要拦截高度为h的导弹,我们有两种选择,一种是用已经有的系统去拦截,另一种是新开一个系统,根据每个系统的性质我们可以知道,系统末尾元素肯定是最小的,而且比它大的元素不能接在它后面,所以如果所有系统的末尾都小于h,那么只能新开,如果有一部分系统的末尾不小于h,那么为了使结果尽可能的少,肯定是接在它们中某一个的后面更划算,那么就要考虑接在谁的后面更好,把h接上后会减少序列末尾的值,为了使它们能够拦截后面更高的导弹,肯定是将h接在这些序列中小的那个后面才是最优的解法。原创 2024-01-16 19:36:50 · 832 阅读 · 0 评论 -
Codeforces Round 920 (Div. 3)补题
ps:贪心问题一个很重要的思想就是,要使得每一步都是最优,如果我们同时确定两个元素,实际上没办法使得每一步都最优,因为下面这种情况,如果我们在确定a[i]的时候就确定a[j]与b[i]匹配,显然不是最优的,因为与a[j]最后的匹配显然在后面,那么如果在后面的话,a[j]也不能挑b[i-1],因为它与a[i+1]产生的效益更大,所以,a[j]是最后被匹配的,那么刚好符合上面的那个思路。我们每次只确定一个最大的出来。由图可知如果两者之间有偶数行,那么要么平局,要么A胜利,如果是奇数行,要么平局,要么B胜利。原创 2024-01-16 12:37:38 · 939 阅读 · 0 评论 -
Codeforces Round 918 (Div. 4)补题
题目大意:现在有n个城市,n个城市之间共有m条边,城市与城市之间通行必须使用自行车,每个城市都有一辆自行车出售,第j个城市的自行车的系数为sj,每条边有一个边权wi,当我们用第j辆自行车去通过第i条边的时候,花费的时间是sj*wi,当然我们可以换自行车,也可以就着一辆自行车骑很远,只要我们买了它,问从1到n的最少花费的时间是多少。题目大意:现在有n个酒杯,每个杯子中装的酒的数量不同,A只喝奇数序号杯子中的酒,B只喝偶数序号杯子中的酒,问能否找出一个区间,两人都只喝区间范围内的酒,并且喝的酒的量是相同的。原创 2024-01-15 11:02:10 · 1025 阅读 · 0 评论 -
Codeforces Round 919 (Div. 2)补题
最关键的就是怎么记录这些数据,而且还要区分哪些是插入的,哪些是复制的。3.对容器p的遍历,因为我们容器中存的是复制对应的操作位置i,那么dp[i]就可以得到这个复制操作执行完后,最右端的位置,dp[i-1]+1就是这个复制区间的左端点,但是因为dp[i]和dp[i-1]对应位置的值在v[]中都有记录,如果k在这两个位置,那么我们就不进行处理,可以直接去找值,如果不是,那么k就要转化,转化操作为k%dp[i-1],因为dp[i-1]是前面被复制区间的长度,所以这样就可以得到k位置在被复制区间中的位置。原创 2024-01-14 11:46:21 · 834 阅读 · 0 评论 -
Codeforces Round 916 (Div. 3)补题
另外为了尽可能地减少递归,我们假设已经配对地点全在最大子树中,这样就可以减少最大子树的点数,因为只有最大的子树的点数可能超过总数的一半,所以不用担心最大子树的点数减掉已经配对的点后,变成不是最大的,反正剩下的点数也少于总点数的一半,并没有什么影响。题目大意:现在有n种求,对于A和B,她们手中每个球分别有a[i]和b[i]个,现在进行一个游戏,A先开始,选择一种球,将手中的这种球扔掉一个,同时B需要扔掉手中所有的此类球,最后求出所有种类球a[i]-b[i]的和。另外要注意,dfs的状态一定要清干净。原创 2024-01-13 19:10:44 · 918 阅读 · 0 评论 -
Codeforces Round 899 (Div. 2)补题
这个最大值可能是负的,那么这也是记录它的意义。最后遍历将正的贡献加起来即可,不用担心前面的移动的贡献,我们在计算每个点的贡献的时候,已经将它前面的点考虑进去了,所以累加即可。题目大意:我们给定一棵树,树的根是不定的,树上的每个节点都有一个值,我们选择任意一个点作为树的根,然后我们对树进行操作,每次操作可以选择一个节点v和一个值c,我们需要做的就是将v以及它的子树的节点值异或上c,然后此次操作的花费就是c*sv(sv表示v的子树的节点数),我们需要对于以每个点为根的情况找出将树上节点的值统一的最小花费。原创 2023-12-15 10:25:44 · 962 阅读 · 0 评论 -
Codeforces Round 901 (Div. 2)补题
那么再往前推,mex-3,它有3种情况:mex直接转,mex-1转,mex-2转,那么不也是用已知的很明确的状态去计算(当然这里回想,是mex->(mex-2)->(mex-3),还是mex->(mex-1)->(mex-2)->(mex-3),但,显然我们的mex-2在计算的时候已经做出了决策,我们取得是小的那个,所以mex->(mex-2)用的是哪种方法我们并不在意,我们在意的只有(mex-2)->(mex-3)的过程)。那么0-mex中间有那么多的数,我们到底用哪个来中转,或者用哪几个来中转呢?原创 2023-12-12 13:02:50 · 893 阅读 · 0 评论 -
Codeforces Round 900 (Div. 3)补题
至于预处理,我们想要获得的是一段区间上的1的个数,那么很容易联想到前缀和,我们可以统计前j个数的第i位上1的个数,然后就可以很容易得到某个区间某一位上1的个数。比如这道题,我们想要的是这段区间求&的后的值,那么我们考虑从二进制的角度如何得到,就是看区间内的数的每一位上的值是否都为1,如果都为1,那么结果的这一位就为1,诚然,对于每个区间都用二进制循环一遍肯定还不如直接暴力,但是,区间的意义就在于,我们可以进行预处理,进而快速获得1的个数,那么如何预处理呢,涉及到区间的预处理就要联想到前缀和。原创 2023-12-11 16:52:17 · 775 阅读 · 0 评论 -
Codeforces Round 914 (Div. 2)补题
真离谱,这么简单的情况竟然没分析清楚。对于第二个预处理数组,我们需要找到每一个位置i,b[i]前面第一个小于它的数,因为如果我们的j在小于b[i]的数前面的话,那么修改的时候,会将一些a[k]变大,大过b[k]而且无法改回去。我们知道对于数组中最大的数,它能选的数就是n-1,那么对于第二大的数,如果s[i]>=a[i+1](假设第i个是第二大的数,i+1是最大的数),那么a[i+1]能选的数,它也一定可以选了,如果s[i]<a[i+1],那么它就只能选它前面的即i-1个(我们的a[]是排好序的)。原创 2023-12-10 14:21:29 · 1299 阅读 · 0 评论 -
Educational Codeforces Round 156 (Rated for Div. 2)补题
那么删除的策略就得到了,先正序遍历,如果后一个字母的字典序小于前一个字母的字典序,就将其删除,最后得到一个字典序非递减的序列,然后再从后往前删除。,我们只考虑哪些是实际能够出现在结果中的,然后当sum>=k的时候退出遍历,然后将后面还没访问到的字符全部放入tmp中,得到的字符串就是我们当前的字符串,因为删除操作都发生在它前面,然后我们只统计了没有被删除的字母,然后将后面没删除的字母也放进去,那么得到的自然是我们想要的当前字符串,因为被删的都去掉了,只留下了没被删的,那么自然是我们想要的。原创 2023-12-09 16:07:19 · 855 阅读 · 0 评论 -
Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final补题
如果小于的话,那么我们先用一个变量来记录当前有多少人被通知到了,然后去循环村民,如果当前村民的bi小于p,那么这个村名肯定是能够去通知其他人的,我们就要看这个村民有没有被通知到,因为有个记录多少人已经被通知的变量,同时,我们的遍历是按顺序的,所以将当前居民的编号和这个变量比较一下即可,如果没被通知,那么就需要P去通知它,然后记录人数的变量加上他可以通知的人的数量。最多只能有三种数,如果要求的种类数>3直接判否,然后如果是3,那么就有m-n种选法,如果这个值小于等于0,那么就判否;如果是1,只有一种选法。原创 2023-12-08 14:09:49 · 885 阅读 · 0 评论 -
Codeforces Round 911 (Div. 2)补题
思路:本来想的是记录所有的叶子节点,以及每个点的父节点的下标及到这个子节点需要进行的操作,我们遍历所有的叶子节点,并往回找知道访问到1,当父节点处的实际操作和到叶子节点的操作不同时,操作数自增,对于每个叶子节点求出需要的操作数,从中取最小值,理论上每个样例的时间复杂度是nlogn,不应该超时,但是很不幸,还是超时了。题目大意:黑板上有若干个数,只有1,2,3三种,我们每次可以选择两个不同的数并擦除,然后添加一个不同于两者的数,问最后能否使黑板上所有的数都相同,如果有可能,那么会是哪些数。原创 2023-12-08 10:12:52 · 867 阅读 · 0 评论 -
Codeforces Round 913 (Div. 3)补题
思路:这道题首先要明确|ai-x|表示的是距离(上次卡在这个地方,竟然没卡在从区间的角度考虑,还是得卡住才能影响深刻嘞,不过上次比较幸运最后想到了这个,直接把思路顺出来了),然后我们替换表示用距离去代替它们,所以很显然如果如果a[i]a[i+1]那么两者的大小关系要改一下,那么就是选的x要离a[i+1]更近。题目大意:我们给定一个棋盘(如下图),棋盘上有一个车,问车可以到的位置,任意顺序输出即可。原创 2023-12-06 18:25:08 · 964 阅读 · 1 评论 -
Codeforces Round 912 (Div. 2)补题
思路:这道题既然是位运算,那么我们就从二进制的角度来看,当所有数的某一位都是1的时候,那么结果的这一位就是1,我们要做的就是在k次操作中尽可能地使高位为1,那么其实可以直接模拟,从高位开始看,遍历每一位,假设要使当前这个数地这一位变成1,需要操作多少次,把次数累加起来,如果次数超过k,那么自然不可以,如果次数小于k,那么可以去看看后面的位还有没有能够变成1的。题目大意:现有一个大小为n的数组a[],我们最多可以进行k次操作,每次操作可以将一个a[i]加1,最后需要求出a[]的&,问最大结果是多少。原创 2023-12-05 18:50:57 · 872 阅读 · 1 评论 -
Educational Codeforces Round 159 (Rated for Div. 2)补题
我们看路径上的p点,它到e点需要经过23,24这两条边,这两条边可以还原到1路径中 ,那么对应的是哪两条边呢,很显然对应的是12,11这两条边,所以我们由此延伸,若(x,y)在倒置后的路径上,那么从(x,y)到e需要走的路径,刚好可以转化成从s出发走的路径,那么它对应的点也由此得到,当然曲曲折折太麻烦,我们直接将边全部平移拉直(或者换句话说,只关注从(x,y)到终点需要往哪个方向走多少步),再将这个对应给起点,然后就可以得到一个新的点,那么这个新的点如果在我们的原路径上,很显然(x,y)也在新路径上。原创 2023-12-04 13:45:04 · 1181 阅读 · 0 评论 -
Codeforces Round 903 (Div. 3)补题
思路:我们来考虑,一个元素能否作为开头,取决于它后面有多少元素,如果它后面的元素的个数小于它的值,那么肯定是不可以的,那么就需要删除。但是还要考虑到一点,如果后面有已经成块的,我们就要考虑,这种情况该如何处理,我们来看,假设当前已经访问到a[i]了,后面的元素个数大于a[i],我们如果以a[i]作为开头,划定一块元素出来,那么剩下的元素就要看能不能成块,不能自然全部删掉,假设划出k个元素,那么就要看以a[i+k]作为开头的时候需要删除几个元素,这样就有了递推式。恭喜你成功战胜低级欲望!原创 2023-12-02 01:12:51 · 909 阅读 · 0 评论 -
Codeforces Round 904 (Div. 2)补题
我们注意到,如果我们统计出每个数有多少个数能够整除它,如果这个数没有在数组中出现,那么这些个数就可以凑出合适的对数,当然,你会问,就算这些数不存在,那么它们的因数存在,不也不可以,那么如果我们在统计的时候考虑到这一点,即一个数的因数出现,那么我们就视作这个数出现,这样处理后剩下的不就是本身及因数都没有出现,但是有数可以整除它,那么再转化一下意思就是有些数对的公因数并未出现在数组中,那么这不就是我们想要找的数对吗。前面再加上前面k-1个0的操作数,那么就得到要使末尾k个都是0,我们需要移动多少次。原创 2023-12-01 19:55:15 · 900 阅读 · 1 评论 -
Codeforces Round 905 (Div. 2)补题
思路:我们以2 3 2 1作为例子来考虑,可以发现,2 3可以但是2 1不可以,所以实际上就是对于一个数字,只能和第一次出现和第二次出现之间的数构成子数组,因为一旦跟后面的构成了,那么前面的一定可以替换它,产生相同的新的子序列,如果仅出现一次,那么与它后面的所有的构成的子数组都是可以的吗?那么我们来统计每个字符的个数,若有m个奇数个数的字符,我们比较m和k的关系,如果m-k>1,那么一定判否,如果m-k==1||m-k==0,那么是ok的;我们要求对于所有的(c[i],b[])的最小操作数。原创 2023-12-01 14:01:32 · 879 阅读 · 1 评论 -
Codeforces Round 906 (Div. 2)补题
但是又要注意,哪怕是用队列来处理,加入就弹出队列,也是会超时的,那么我们考虑,有没有方法能够只循环一次。思路:先判断s本身是否是好字符串,如果是那么直接输出yes,如果不是,那么肯定有00或者11粘连,我们仔细想想,想要把它们隔开,t首先得是好字符串,同时t的首尾必须相同,而且只能隔开一种类型,当00和11同时出现时,就一定不可以。后面的也不能被放进去的话后面的都要小于0,而w,i都随位置的变化而变化,我们干脆预处理出来,只要后面的w-i*c小于前面的,那么前面的一旦判否,后面的就一定不能再被放入。原创 2023-11-30 00:58:08 · 817 阅读 · 0 评论