首页 > 其他分享 >一类经典问题的若干解法

一类经典问题的若干解法

时间:2024-02-17 11:00:42浏览次数:22  
标签:拆成 树状 复杂度 red 经典 mathcal 矩形 解法 若干

标题指的是这类问题:

我们经常会看见求 \(\sum\limits_{x=l}^r\sum\limits_{y=x}^r f(x,y)\) 这类问题。我们常常能够通过智慧将 \(f(x,y)\) 转化为二维平面上的点,然后发现所有 \(f\) 可以用一些矩形加来表示。通常这里面矩形加的次数是 \(\mathcal O(n)\) 或者 \(\mathcal O(n\log n)\) 等低复杂度的。那么得到这些矩形后应该怎么做呢?

方法 \(\mathit1\) - 线段树历史版本和

将其中一维扫描线,将修改和查询都拆成两部分,然后就是线段树历史版本和了。

时间复杂度 \(\mathcal O((m+q)\log n)\),其中 \(n\) 是原序列大小,\(m\) 是修改次数,\(q\) 是查询次数。

方法 \(\mathit2\) - 树状数组

可以将修改拆成 \(4\) 个后缀矩形加,将查询拆成 \(4\) 个前缀矩形查,那么发现这样一来有贡献的修改操作就是端点再前缀矩形内的。那么还是一维扫描线,另一维用树状数组维护。

具体地,一个修改操作 \((x,y,v)\) 对一个查询操作 \((a,b)\) 的贡献是:

\[v(a-x+1)(b-y+1)={\color{red}v}(a+1)(b+1)-{\color{red}vx}(b+1)-{\color{red}vy}(a+1)+{\color{red}vxy} \]

将四个红色部分分别维护就行了。时间复杂度仍是 \(\mathcal O((m+q)\log n)\) 的。


以上两种方法复杂度相同,但是哪个的常数更优秀呢?实践证明,树状数组虽然要拆成 \(4\) 个操作,每个操作又要维护 \(4\) 个部分,保底就有 \(16\) 的常数了,但是树状数组常数本身较小,而线段树涉及标记下传等,还有递归操作,所以实际上树状数组的常数是要略胜一筹的。


方法 \(\mathit3\) - 四分树

我只是提一嘴。

标签:拆成,树状,复杂度,red,经典,mathcal,矩形,解法,若干
From: https://www.cnblogs.com/tulipenoire/p/18017796

相关文章

  • 【Java 并发】【应用】经典的生产者、消费者
    1  前言闲来无事,复习复习并发中常用到的一些协调多线程的工具哈。2 基于Java队列的实现生产者跟消费者之间要协调,他俩会出现碰撞的地方就是存放东西的容器,所以我们可以直接拿一个线程安全的队列来做容器即可,比如我这里用的ArrayBlockingQueue:/***@author:xjx*@d......
  • 算法竞赛经典入门(第2版)习题1
    目前在准备一个竞赛,头绪并不是很清楚,根据知乎的推荐入了一本书《算法竞赛入门经典》(第2版)...下面是写的例题和习题答案也算是简单记录一下学习过程吧。//三位数反转#include<stdio.h>intmain(){intn;scanf("%d",&n);printf("%d%d%d\n",n%10,n/10%10,n/100)......
  • 非对称加密的经典案例-ssh密码登录/免密登录
    我在给云服务器配置本地电脑免密登录的过程中,学习了一下SSH免密登录的实现原理。对SSH中输入密码登录和免密登录的原理根据自己的理解做了如下笔记,分享给大家希望能有所帮助。1.对称加密对称加密是加密过程中只有一个密钥,加密解密都只用这个密钥。加密通讯至少要有一对通讯对......
  • 面试经典 150 题 (十七)
    思路:1、先将下标和高度放入HashMap中,防止排序之后破坏高度和下标的映射关系2、将HashMap转成Map.Entry的列表并且重写Collections.sort中的sort方法实现将数组按照键值对的值从大到小排序。3、设置flag数组用于标识那些高度区间没有被访问过4、从排序好的数组中取出高度,再向......
  • 面试经典 150 题 (十六)
    classSolution{publicintcandy(int[]ratings){//从左侧和右侧分别扫描一遍,计算当前孩子是否是比两侧的孩子优秀intlength=ratings.length;int[]candyNum=newint[length];for(inti=0;i<length;i++){c......
  • 面试经典 150 题 (十五)
    画折线图,亏空最严重的一步要最后一步做,等着前面的增益补(总体收益大于等于0的情况),因为本题有解就唯一,当总gas大于总cost一定有解classSolution{publicintcanCompleteCircuit(int[]gas,int[]cost){intlen=gas.length;intspare=0;......
  • 使用经典技术的音乐网站
    项目地址技术栈后端SpringBoot+MyBatis+Redis前端Vue3.0+TypeScript+Vue-Router+Vuex+Axios+ElementPlus+Echarts简介是一个经典简单的音乐网站。后端基本也就是在CRUD,redis是当缓存用的,数据库用的是mysql.XML自定义(附加)mybatis-plus的mapper配置mapper......
  • 面试经典 150 题 (十四)
    就用除法classSolution{publicint[]productExceptSelf(int[]nums){int[]answer=newint[nums.length];intsum=1;intzeroNum=0;for(inti=0;i<nums.length;i++){if(nums[i]==0)zeroNum++;......
  • 面试经典 150 题 (十三)
    先来个大的classRandomizedSet{privateHashSet<Integer>hashSet;publicRandomizedSet(){hashSet=newHashSet<Integer>();}publicbooleaninsert(intval){if(hashSet.contains(val)){returnfa......
  • 面试经典 150 题 (十二)
    排序,i代表至少发表的论文数量时间复杂度:O(nlogn)空间复杂度:O(logn)classSolution{publicinthIndex(int[]citations){//01356intlength=citations.length;Arrays.sort(citations);inth=0;for(inti=1......