首页 > 其他分享 >ABC346

ABC346

时间:2024-05-23 10:53:54浏览次数:10  
标签:二分 这个 差分 ABC346 做法 排序 我们

E题
这题是春季测试涂色游戏的进阶版本,这个题的正确做法是”时光倒流“,因为是覆盖问题,所有从后面做倒着向前走,可能会更好
但是这个题,我有一个做法是\(o(nlogn)\)的,我们先来考虑列,将列排序,按照时间来排序,对于每一行来说,每一列的染色时间都确定好了,我们可以二分

为什么思考是二分?

因为数据范围是\(2*10^5\),所以时间复杂度为\(o(logn)\),非常合理,但是这个也限制了思考,根本没有往\(o(n)\)的方向思考

如何二分呢?

我们先来考虑列,将列排序,按照时间来排序,对于每一行来说,每一列的染色时间都确定好了,我们可以二分找到小于等于t(行的时间)的个数,然后将这个个数的染色都变成行的颜色,这个地方是能考虑到的

和正解差在哪里?

差就差在大于t的那些列,但是我就觉得应该一个一个的枚举过去,但其实不用,我们使用差分就可以了,我们记录\(cf[i]\)表示i之后的行都被记录一次,这样我们能得到一个差分前缀和,这就是这个列被记录了多少次,最后我们统计颜色的时候,把这个个数加到相应的颜色即可

总结

没想到差分还能这么用,一直以为,差分就是给出了具体的区间,但其实这个差分的使用更加突出了差分的意义,就是不美剧,只记录,所以差分的使用还是不数量

题目部分分设置

所以这个题可以改编,\(o(nlogn)\)的做法可以做到60分,正确的做法是\(o(n),这个可以100\)

标签:二分,这个,差分,ABC346,做法,排序,我们
From: https://www.cnblogs.com/sdfzls/p/18207717

相关文章

  • [题解]ABC346 补题C~E
    想起上次的ABC346没打,刚才虚拟参赛打了A~D,E题思路有,但是实现方式没选好导致WA了,没能在赛时做出来。写下题解记录一下~C-Σ用求和公式先把\(1\simk\)的和求出来:\(\frac{k(k+1)}{2}\),然后对于\(A\)数组中的元素依次减去就行(注意相同元素不能减\(2\)次)点击查看代码#include<b......
  • abc346
    D-GomamayoSequence给定\(N\)长的01字符串,使其满足,只有一个下标\(i,S_{i}=S_{i+1}\)对于\(S_i\),他改变的花费为\(C_i\),若\(S_i=0,则它变为1,否则变为0\)因为只有一对相同的字符组(i,i+1)维护\(1-i\)以\(j\in{0,1}\)结尾的01交替串的花费维护\(i-结尾\)以......
  • abc346D 生成仅一处相同01串的最小代价
    给定由0和1组成的字符串s[n],翻转第i个字符需要花费c[i],现在修改s,使得有且只有一个i满足s[i]==s[i+1],求最小花费。2<=n<=2e5;1<=c[i]<=1e9可以动态规划,记dp[i][j][k]表示前i个字符,以j结尾,存在k处相等的最小花费,对每个位置,枚举改与不改两种情况进行转移。#include<bits/stdc++.......
  • ABC346
    T1:AdjacentProduct模拟代码实现n=int(input())a=list(map(int,input().split()))foriinrange(n-1):print(a[i]*a[i+1])T2:Piano周期性代码实现#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<(n);++i)usingnamespacestd;int......
  • ABC346
    D枚举是哪一位相同,情况为\(00\)还是\(11\),然后用前缀和和后缀和求一下即可。\(pre_{j,i}\)表示第一位为\(j\),前\(i\)位的每两个相同的字符均不相同的情况,\(suf\)同理。codeE从后往前考虑。每一种颜色能染上这一行/列没有被染色的格子数,所以记录一下每一行,每一列......