CDQ分治总结
\(CDQ\)分治小结
标签:知识点总结
阅读体验:https://zybuluo.com/Junlier/note/1326395
身为一个资深菜鸡
\(CDQ\)分治一开始学了一晚上,后来某一天又复习了一晚上(和重新学一样。。。)
现如今才发现自己还有这个坑没有填。。。于是来填坑了。。。
简介定义
\(CDQ\)就是对于问题一层一层分治达到可做状态(懵逼吧)
正儿八经地讲
PS:以下面题目里的三维偏序洛谷模板为准。。。
都做过二维偏序吧。。。
有一种做法是第一维排序,第二维树状数组查询前缀和对吧(或者第二维归并)
我们考虑把二维偏序拓展到三维偏序\((a,b,c)\)
还是考虑第一维排序,第二维则归并排序,第三维我们再套树状数组来解决
那么具体怎么做呢?
把第一位直接在最外层排序一遍,那么\(a_i\)是有序的了对吧
考虑对第二维进行归并,考虑怎么让其帮助第三维统计呢
(PS:这里笔者刚学的时候一直不是很明白,所以希望自己讲仔细一点。。。)
首先思考归并排序是一个怎样的过程,先递归子任务,让左一半和右一半有序,然后直接插排
我们可以借助归并排序这个左右都变得有序的阶段
很显然这个时候左边一段和右边一段是按\((a,b)\)有序的,那么我们直接考虑左边对右边的贡献
也就是说,左边的\(a\)肯定是比右边的\(a\)小的,然后可以在对\(b\)进行插入排序的时候用树状数组统计
以\(b\)为下标,\(c\)为权值构一棵树状数组,每次把左边的\((b,c)\)插入,从右边在树状数组中统计
仔细思考一下,很难马上理解,但应该对你有所帮助\(QwQ\)
可以结合代码看一下(虽然我压行。。。)
#include<bits/stdc++.h>
#define il inline
#define rg register
#define ldb double
#define lst long long
#define rgt register int
#define N 100050
using namespace std;
const int Inf=1e9;
il int read()
{
    rgt s=0,m=0;rg char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')m=1;ch=getchar();}
    while( isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
    return m?-s:s;
}
int n,K,tot;
int sum[N<<1],ans[N];
struct LJL{
    int a,b,c,num,siz;
    il int operator !=(const LJL &y)const
        {
            return a!=y.a||b!=y.b||c!=y.c;
        }
}ljl[N],tmp[N];
il int cmp(const LJL &x,const LJL &y)
{//按(a,b,c)排序
    if(x.a!=y.a)return x.a<y.a;
    if(x.b!=y.b)return x.b<y.b;
    return x.c<y.c;
}
il void Upd(int loc,int x){for(;loc<=K;loc+=(loc&(-loc)))sum[loc]+=x;}
il int Query(int loc){rgt ret=0;for(;loc>=1;loc-=(loc&(-loc)))ret+=sum[loc];return ret;}
//树状数组部分,打的时候很舒服,看起来般般子
void CDQ(int L,int R)
{
    if(L==R)return;rgt mid=(L+R)>>1;
    CDQ(L,mid),CDQ(mid+1,R);//归并
    rgt i=L,j=mid+1,p=L;
    while(i<=mid&&j<=R)
        if(ljl[i].b<=ljl[j].b)Upd(ljl[i].c,ljl[i].siz),tmp[p++]=ljl[i++];
        else tmp[p]=ljl[j],tmp[p++].num+=Query(ljl[j++].c);
    while(i<=mid)Upd(ljl[i].c,ljl[i].siz),tmp[p++]=ljl[i++];
    while(j<=R)tmp[p]=ljl[j],tmp[p++].num+=Query(ljl[j++].c);
    for(rgt i=L;i<=mid;++i)Upd(ljl[i].c,-ljl[i].siz);
    for(rgt i=L;i<=R;++i)ljl[i]=tmp[i];
}
int main()
{
    n=read(),K=read();
    for(rgt i=1;i<=n;++i)
        tmp[i]=(LJL){read(),read(),read()};
    sort(tmp+1,tmp+n+1,cmp);
    for(rgt i=1;i<=n;++i)
    {
        if(tmp[i]!=tmp[i-1])ljl[++tot]=tmp[i];
        ++ljl[tot].siz;
    }
    CDQ(1,tot);
    for(rgt i=1;i<=n;++i)ans[ljl[i].num+ljl[i].siz]+=ljl[i].siz;
    for(rgt i=1;i<=n;++i)printf("%d\n",ans[i]);return 0;
    return 0;
}
给一些题目
- [x] 洛谷P4390 [BOI2007]Mokia 摩基亚
 - [x] 洛谷P3810 【模板】三维偏序(陌上花开)
 - [ ] 洛谷P3157 [CQOI2011]动态逆序对
 - [ ] P4169 [Violet]天使玩偶/SJY摆棋子
 - [ ] P2163 [SHOI2007]园丁的烦恼
 
上面那些BZOJ都有。。。可以各大OJ多倍经验
CDQ分治总结的更多相关文章
- 【教程】简易CDQ分治教程&学习笔记
		
前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦! CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...
 - BZOJ 2683 简单题 ——CDQ分治
		
[题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...
 - HDU5618 & CDQ分治
		
Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...
 - 初识CDQ分治
		
[BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 200 ...
 - HDU5322 Hope(DP + CDQ分治 + NTT)
		
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...
 - BZOJ4170 极光(CDQ分治 或 树套树)
		
传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...
 - BZOJ2683 简单题(CDQ分治)
		
传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...
 - BNUOJ 51279[组队活动 Large](cdq分治+FFT)
		
传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...
 - 【BZOJ-3262】陌上花开       CDQ分治(3维偏序)
		
3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1439 Solved: 648[Submit][Status][Discuss ...
 - 【BZOJ-1176&2683】Mokia&简单题        CDQ分治
		
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
 
随机推荐
- 对flex深入研究一点
			
flex顶层设计 1.在任何流动的方向上(包括上下左右)都能进行良好的布局 2.可以以逆序 或者 以任意顺序排列布局 3.可以线性的沿着主轴一字排开 或者 沿着侧轴换行排列 4.可以弹性的在任意的容器 ...
 - Let Us Adore 让我们来敬拜祂 中文歌词
			
Verse 1 诸天宣告 神的荣耀 万国万民 都将赞美 宣扬祂奇妙 The heavens declare The glory of God And all of the world Will j ...
 - 各种注意事项(还有c++的一些操作)
			
转c++时间: 2017年8月9号 1.记得打头文件 2.=与==的区别(赋值|比较) 3.各种运算符的比较级(与Pascal不同),主要是==与位运算 *4.在OJ上scanf和printf时间优于 ...
 - 2. ClustrixDB 文件/参数说明
			
一.日志/data/clustrix/log/query.log 记录节点慢SQL/错误SQL/DDL 等信息,节点分开记录 Each entry in the query.log is catego ...
 - BZOJ 5028 小z的加油站
			
bzoj链接 Time limit 10000 ms Memory limit 262144 kB OS Linux 感想 树上动态gcd的第二题也好了. [x] BZOJ 2257 [JSOI200 ...
 - sqli-labs(6)
			
双注入GET双引号字符型注入 0x01(这里思路和05一样只是单引号变成了双引号) 首先我们看见这个网站 又是不显示值的 所以想到用报错的信息来得出你想要的结果 有了思路之后来试试一下吧 先填入单引号 ...
 - [LeetCode]-DataBase-Combine Two Tables
			
Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...
 - (知识)width、naturalWidth、clientWidth、offsetWidth区别整理
			
今天在做图片裁剪功能的时候,参考了下网友的资料,发现大家对图片宽度的获取方式不尽相同,于是详细整理下各个属性的区别(详细请参考MDN). 1,HTMLImageElement.width是一个unsi ...
 - SpringMVC拦截器+Spring自定义注解实现权限验证
			
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
 - yanse
			
0E71F9 左上面蓝色 0EA8FF 左下面蓝色 498B54 右边绿色