搞了半天才发现时间分治和cdq分治是一个东西……

当对于一个操作的静态操作较简单,动态操作较复杂,并且后面对前面没有影响,还有操作序列可以合并(前提真的很多,还有看你能不能想出来),我们可以使用时间分治。

以归并排序举例,归并排序的代码如下:

void MergeSort(int l,int r)
{if (l == r) return;int mid = (l+r)/2;MergeSort(l,mid);MergeSort(mid+1,r);inplace_sort(a+l,a+mid+1,a+r+1);
}

(虽然好像inplace_sort就是归并排序啊233)

将归并排序操作的序列想象成一个操作序列,很明显,归并排序满足一下几点性质

1.区间可以合并

2.前面的序列与后面无关

于是时间复杂度 T(n) = 2*T(n/2)+O(n)(合并的代价,对于实际问题就是静态操作的代价)

根据主算法, T(n) = n logn

(其实我也没完全搞懂,关于区间合并这一块事实上难度是很大的,如HNOI city 城市建设,各种缩点乱搞)

那么,时间分治作用事实上就是一个替代品,跟主席树一样强大的替代品,它可以解决许多需要树套树的问题,甚至可以解决一些范围极大的问题

(上一道水题理解一下)

BZOJ 1176

给定一个初值相同的矩阵,有两个操作

(1)1 x y delta 给(x,y)加上delta

(2)2 x1 y1 x2 y2 求矩形内的和

其中w <= 2000000,q<=160000,m<=10000

经典线段树套线段树,不对好像范围有点大……二维线段树早就不知道MLE到哪里去了

于是我们便想到了时间分治,我们将[x1,y1],[x2,y2]差分成四个和

以x为第一关键字,y为第二关键字,再用树状数组维护一下就ok了(具体细节参考代码)

#include <cstdio>
#include <algorithm>using namespace std;const int MAXW = 2000001;
const int MAXN = 200000;struct Node
{int x,y,delta,flag,idx;bool operator < (const Node &rhs) const{return x < rhs.x || (x == rhs.x && y < rhs.y); }
};int s,w,cnt,cntq;
int ans[MAXN];
Node C[MAXN];int c[MAXW];void modify(int pos,int delta)
{for (int i=pos;i<=w;i+=(i&-i)) c[i] += delta;
}int query(int pos)
{int ans = 0;for (int i=pos;i>0;i-=(i&-i)) ans += c[i];return ans;
}void solve(int l,int r)
{if (l == r) return;int mid = (l+r)/2;solve(l,mid);solve(mid+1,r);int j = l;for (int i=mid+1;i<=r;i++){if (C[i].flag == 2){for ( ;j<=mid && C[j].x <= C[i].x;j++)if (C[j].flag == 1) modify(C[j].y,C[j].delta);ans[C[i].idx] += query(C[i].y)*C[i].delta;}}for (int i=l;i<j;i++) if (C[i].flag == 1) modify(C[i].y,-C[i].delta);inplace_merge(C+l,C+mid+1,C+r+1);
}int main()
{scanf("%d%d",&s,&w);int oper;while (scanf("%d",&oper) == 1 && oper != 3){if (oper == 1){int x,y,delta;scanf("%d%d%d",&x,&y,&delta);C[++cnt] = (Node){x,y,delta,1,cnt};}else{int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);cntq++;C[++cnt] = (Node){x1-1,y1-1,1,2,cntq};C[++cnt] = (Node){x1-1,y2,-1,2,cntq};C[++cnt] = (Node){x2,y1-1,-1,2,cntq};C[++cnt] = (Node){x2,y2,1,2,cntq};ans[cntq] = (x2-x1+1)*(y2-y1+1)*s;}}solve(1,cnt);for (int i=1;i<=cntq;i++) printf("%d\n",ans[i]);return 0;
}

还有那些比较复杂的区间合并,例如cf最近那题动态割边什么的……以后再说吧

时间分治(cdq分治)相关推荐

  1. 点分治+CDQ分治+整体二分全纪录

    点分治 点分治讲解 解决树上路径问题 经典例题:点分治(长度小于m的路径计数) 经典例题:点分治(聪聪可可) 经典例题:点分治(多个定值路径计数) 经典例题:点分治(采药) 经典例题:点分治+ST表+ ...

  2. BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...

  3. 牛客网暑期ACM多校训练营(第九场)H. Prefix Sum(CDQ分治)

    题目描述 Niuniu has learned prefix sum and he found an interesting about prefix sum. Let's consider (k+1 ...

  4. [总结]CDQ分治整体二分

    从昨天到现在除了90%的颓废时间一直在研究一些分治的姿势,主要就是CDQ分治和整体二分. 首先推荐一些学习资料: 陈丹琦 <从 < Cash > 谈一类分治算法的应用> 许昊然 ...

  5. CDQ分治(二维CDQ 、三维CDQ+树状数组、四维CDQ+CDQ+树状数组)

    CDQ分治 CDQ分治相较于普通分治,多了左区间处理后对于右区间的影响. 利用这一点,CDQ分治可以用来做很多数据结构的题目(树状数组.线段树),加一个log的时间复杂度来优化一维. 操作: 假设有两 ...

  6. CDQ分治【分治(真得头疼)

    前言: 说实话我对于这种没有固定板子,变化多端的算法实在是非常头疼的 但是不学不行,这也是一种很重要的思伟方式 所以趁着这几天的心情比较好(快要放大周),赶紧学一波~ 鸣谢:tham,stdcall ...

  7. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  8. CDQ分治——学习笔记

    前言 因为中国集训队的大佬们总会发明一些新的东西,所以中国的计算机竞赛水平才会一直处于国际前沿,而cdq分治也是某一年的集训队成员发明的算法. 什么是CDQ分治 cdq分治是一种分治(这不是废话嘛), ...

  9. 三维偏序/cdq分治/

    三维偏序---cdq分治 cdq分治概述 二维偏序概述 二维偏序例题分析 三维偏序概述 例题分析 cdq分治概述 前置知识:(如果不懂要先去了解分治) > 分治: > 分而治之,将原问题不 ...

最新文章

  1. java微信公众号开发token验证失败的问题及解决办法
  2. C#命名规则和编码规范
  3. java 大小相间排序_ArrayList实现根据某属性大小相间排序
  4. div内的button的click会触发两次(防止事件冒泡)
  5. 循环队列及C语言实现二
  6. ios上传音频文件到服务器,IOS开发:iPod的音乐库中的音频如何上传到服务器中...
  7. 使用Tampermonkey进行JavaScript编程
  8. java 数组写入txt_java编程,如何把一个数组中的内容写入一个txt文档中
  9. 5.15java例题:水仙花 奇偶数 三个和尚 求和 偶数求和 两只老虎 逢七过 减肥案例
  10. 云原生API网关 - 开源项目Hango网关设计与实践
  11. android svg路径动画,五、Android SVG动画
  12. 【收集】个人认为比较实用的手机软件
  13. SQL注入:搜索型注入
  14. C/C++编程:模板特例
  15. passive-interface的含义
  16. 保弘实业|工薪阶层家庭理财需要管理的四大钱包
  17. aspose无法在Linux无法运行,com.aspose 生成pdf在linux生成PDF乱码解决(window环境正常)...
  18. 兄弟3150cdn灯亮error_兄弟3150cdn彩色打印机一直显示红灯
  19. 【L2-035 完全二叉树的层序遍历】天梯赛L2详解
  20. VUE3中,使用.env.development和.env.production

热门文章

  1. 20220529 pdf 分割合并软件,python tkinter
  2. goproxy.io for Go modules
  3. Fabric交易流程
  4. Deploy k8s(1.25)
  5. 企业员工虚拟股权激励制度
  6. 软考_法律法规与标准化知识
  7. 算法之BTree(Java版)
  8. error: cannot connect to daemon
  9. 维度建模的基本概念及过程
  10. 【深度学习】各种卷积的理解笔记(2D,3D,1x1,可分离卷积)