首页 > 其他分享 >某些想法

某些想法

时间:2023-10-17 09:57:09浏览次数:41  
标签:遍历 gcd 某些 最大值 想法 枚举 该题 我们

1.转换遍历对象与改变求和顺序:
对于某些需要枚举序列元素来获取信息的题目,当n很大以至于O(n)也超时的时候,我们可以考虑枚举序列中数的值,把枚举对象转换为值域,枚举值域的贡献。

Effects of Anti Pimples这题。

很显然有一个做法是枚举每个数的所有所在集合然后找出最大值来算,时间复杂度会爆炸。但实际上,对于该题可以通过直接枚举以a[i]为黑染色后面最远加入a[j]时集合的最大值来减少无效遍历,只需考虑一个数若在序列中是集合中的最小最大值,显然只有1个集合里有它,而后可以推出对于第i个最大值,显然有 2 ^ (i-1)个集合里其为最大值。只算它作为最大值的贡献,便可最多在O(nlogn)的时间复杂度内解决问题。

还如该题:


该题n,k<=3e5,ai <= 1e6
该题如果是按满足i - j >= k的序列下标进行遍历,然后判断是否是最大值需要O(n ^ 2)的时间,但或许可以换一个角度,我们提前预处理出来某个数或某个数的倍数在序列中最靠左的位置和最靠右的位置,然后枚举值域中的每个数,看两个预处理出来的位置之差是否大于等于k,我们只是转换了条件,因为当某个数对gcd最大的时候,显然是两者相等的情况,当然这种条件比较苛刻,它的倍数与它的gcd也是它本身,从大到小枚举这个数,第一个合法的一定是最大值。相当于我们先满足gcd(a[i],a[j])最大这个条件,再判断下标之差是否大于等于k。
我们再思考一下为什么第一种方法会O(n ^ 2),这是因为对于一个已经在序列中出现过的数,我们后面再枚举到的时候,其实就没必要向后枚举了,因为若前面那个数不满足条件,此时枚举的数在后面,更没有必要枚举。这是正着来的,我们再反着来一遍,便能得出所有合法情况。但此时依然不是很优,因为我们这样枚举依然会枚举到很多无效的数,它们对答案并无影响,我们只考虑对于一个数比它大且为它的倍数的数对它的影响即可。
好了,由第一种方法的局限性,我们考虑要提前预处理出来一个数前面与后面比它大且为它的倍数的数的位置,并且对于一个数我们只用处理一次,后面再出现重复的也没必要了。既然如此,为何不构造一个每个数只出现一次的序列呢,更简单一些,为什么不直接枚举这里面每个数的值呢。由此第二种方法自然推出。

还有一个经典问题。

求树上所有点对的距离之和,当然,我们可以直接两个for,for循环,然后用lca算距离,O(n ^ 2 log n)当然可以解决,但我们可以考虑点对距离之和,实际上是由两点之间的边组成的,每条边的权值一定,该边做的贡献显然是将他切断后,所形成的两个区域的点数的乘积乘上边的权值,我们可以先dfs出每个节点的子树内的节点个数num[u],然后num[u] * (n - num[u]) * w即可,最后求和,即为所求。也不只是所有点对之间的距离,凡是边所能维护的某些权值均可。也不是非要所有点对,也可以存在一些特殊点,这时候,我们考虑dfs出一个子树内所有的特殊点个数,然后利用num[u] * (sum - num[u]) * w即可。

[CSP-S2019 江西] 和积和

该题的形式比较复杂,纯暴力显然是O(n ^ 4),用前缀和预处理的话能达到O(n ^ 2)。
这时候我们不妨考虑,该题所给式子的意义是什么。在[1,n]中的所有子区间中区间内b的和与a的和的乘积,我们的暴力相当于是为了先满足区间这个条件,然后算b和a对于该区间的贡献,不妨换一个角度。我们直接考虑b和a对于所有区间的贡献,即
将原式换成 ∑b[i] * ∑a[j] * q[i],即考虑包括b[i]与a[j]的区间个数有多少个。当i < j 时,显然此时区间的左端点有i个取值点(1 ~ i),区间的右端点有n - j + 1个取值点(j ~ n),那么此时对答案的贡献就是 ∑b[i] * i * ∑a[j] * (n - j + 1),i > j 时也易类比推出,得到这两个式子后,我们发现,∑a[j] * (n - j + 1) 与 ∑a[j] * j 都是可以预处理出来的,于是O(n)即可解决。这题我们一开始思考式子的实际含义,然后转换遍历对象,实际上是一种改变求和顺序的想法。
改变求和顺序也有一个经典的应用。

莫比乌斯反演

这个经典式子:
∑∑[gcd(i,j) == 1]
用莫比乌斯反演后可以转变为∑∑∑μ(d),其中第三个∑,d的条件是为gcd(i,j)的约数,此时可以抽象成一个表格,有n行m列,对于i行j列的这个格子,它的贡献是∑μ(d),d|gcd(i,j),那我们可以转换一下遍历对象,考虑对于一个d,它对多少个表格做了贡献,即它是多少个表格行数列数gcd的约数,那我们可以把原式改成这样 ∑μ(d)∑∑[ d | i 且 d | j ],这实际上是改变了求和顺序,而后面那两个∑,很显然是down[n/d]*down[m/d] (down为向下取整)。
由此我们多少可以看出,求和顺序的改变本质显现的是改变遍历对象,而改变遍历对象在数学式子上的体现便是求和顺序的改变。

标签:遍历,gcd,某些,最大值,想法,枚举,该题,我们
From: https://www.cnblogs.com/rainylover/p/17768996.html

相关文章

  • 笨办法学Python3 习题21 函数可以返回某些东西
    知识点:函数放在=右边也可以马上被执行调用函数可以和函数结果的变量一起运算关键词 return 的用法脚本函数运行内容:定义函数1(参数1,参数2),打印加法句子,返回加法结果定义函数2(参数1,参数2),打印减法句子,返回减法结果定义函数3(参数1,参数2),打印乘法句子,返回减法结果定义函......
  • 碎碎念的一些想法
    现如今的网络环境各大平台圈地自立互不共享信息一些信息都很难在搜索引擎上找到而搜索引擎也为了生存在排行上遍布广告各种杂牌虚假无用信息的网站用搜索引擎的规则专门做seo致使现在想获取高质量的信息越来越难了人才是网络信息传播的主体平台为了抢人,威逼利诱,让信息聚集......
  • 关于博客的想法
    为什么要写博客  虽然简单的说只是记录和梳理自己学到的东西,但我们这些搞IT的尤其喜欢写博客,这其中自然有软件开发相关技术庞杂,而且技术框架的迭代演进也很快,今天有个高可用的框架出来,明天有个更可靠的RPC组件发布,虽说学不动这句话大家常挂在嘴边,不过有新的更好的技术出来我们......
  • 电脑某些网站或者所有网站突然打不开
    问题:电脑某些网站或者所有网站突然打不开,但是用手机能打开。解决方案:修改电脑上的DNS为自动获取。具体步骤:控制面板->网络和共享中心->更改适配器设置,右击当前网络选择“属性”->Internet协议网版4(TCP/IPV4),选择自动获得DNS服务器地址。如下图所示:......
  • 当桌面上的图标变白时,这可能是因为以下某些原因导致的
    当桌面上的图标变白时,这可能是因为以下某些原因导致的:图标缓存问题:Windows会缓存图标以提高系统性能,在某些情况下,这些缓存可能会损坏,导致图标变白或显示不正确。你可以尝试清除图标缓存并刷新桌面,方法是打开命令提示符窗口,输入命令:ie4uinit.exe-show,回车后等待几秒钟,然后重新启......
  • 想查看某些网站源码,结果发现网站F12被禁用,怎么解决?
    当我们访问某些网站的时候,发现网站是禁用了F12和右键功能的。比如想保存网页上的一些文字或图片等,新手不知道怎么破除。下面分享给大家几种方法:1、打开网页后,鼠标点进浏览器地址栏,再按F12键,就可以用了。2、打开网页后,鼠标点进浏览器地址栏,再按快捷键Ctrl+U,就可以用了。3、可以......
  • CDN 在某些页面上提供图像,但在其他页面上不提供图像
    如果在某些页面上使用CDN提供图像,但在其他页面上不提供图像,可能是以下几个原因导致的:1.页面链接错误:检查在不提供图像的页面上,图像的链接是否正确。确保链接指向CDN上的正确图像位置。2.缓存问题:有可能之前访问缺少图像的页面时,图像链接出现问题,导致浏览器缓存了错误的链接。尝试......
  • io 某些类 可以不必关闭 close
    OutputStream的close为空方法如例子贴源码publicclassDataOutputStreamextendsFilterOutputStreamimplementsDataOutput{}publicclassFilterOutputStreamextendsOutputStream{/***Theunderlyingoutputstreamtobefiltered.*/protectedO......
  • 某些shabi公众号的lj行为
    真TM无语!你的资源收费你就明明白白的写收费啊!什么TM都不写,搞半天下载好了,TM的解压要密码,浪费别人时间,真TMshabi!!执笔为灯!我执nima! ......
  • 2023-09-07:用go语言编写。塔子哥最近在处理一些字符串相关的任务 他喜欢 R 字符,因为在
    2023-09-07:用go语言编写。塔子哥最近在处理一些字符串相关的任务他喜欢R字符,因为在某些任务中,这个字符通常表示“正确”的结果另一方面,他不喜欢B字符,因为在某些任务中,这个字符通常表示“错误”的结果为了解决他的任务,塔子哥定义了字符串的权值为字符串中R字符的出现次数例如,......