bryce1010专题训练——CDQ分治
CDQ分治
1、与普通分治的区别
普通分治中,每一个子问题只解决它本身(可以说是封闭的)
分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身
2、试用的情况
在很多问题中(比如大多数数据结构中),经常需要添加一些动态问题,然而对动态问题的处理总是不如静态问题来得方便,于是就有了分治
但使用分治的前提是必须有一下两个性质:
- 修改操作对区间询问的贡献独立,修改操作互相不影响
- 题目允许使用离线算法
2.1 一般步骤
- 将整个操作序列分为两个长度相等的部分(分)
- 递归处理前一部分的子问题(治1)
- 计算前一部分的子问题中的修改操作对后一部分子问题的影响(治2)
- 递归处理后一部分的子问题
特别说明:
在整个过程中,最核心的就是步骤3
此时前一部分子问题中的修改操作相对后一部分子问题来说是静态处理,因此可以更加方便地计算后一部分子问题
3.题集
3.1 51nod 1376 最长递增子序列的数量
用f[i]表示以第i个数结尾的LIS的长度和该长度的数量 len count
显然
f[i].first=max{f[i].first}+1,j<i&&a[j]<a[i]" role="presentation" style="position: relative;">f[i].first=max{f[i].first}+1,j<i&&a[j]<a[i]f[i].first=max{f[i].first}+1,j<i&&a[j]<a[i]
f[i].second=∑jf[i].second,f[j].first=f[i].first−1" role="presentation" style="position: relative;">f[i].second=∑jf[i].second,f[j].first=f[i].first−1f[i].second=∑jf[i].second,f[j].first=f[i].first−1
二维偏序,一维下标,二维值;
直接cdq分治处理:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
int n,a[MAXN];
#define P pair<int,int>
P f[MAXN];//LIS length,count
void getMax(P& x,P y)
{
if(x.first<y.first)x=y;
else if(x.first==y.first)
{
if((x.second+=y.second)>=MOD)
x.second-=MOD;
}
}
int id[MAXN];
/*排序小技巧
避开相等,间隔排序,把可能成为询问的排到第一个
*/
bool cmp(int x,int y)
{
if(a[x]!=a[y])return a[x]<a[y];
return x>y;
}
void cdq(int l,int r)
{
if(l==r)return;
int m=(l+r)>>1;
cdq(l,m);
for(int i=l;i<=r;i++)id[i]=i;
sort(id+l,id+r+1,cmp);
P maxf(0,0);
for(int i=l;i<=r;i++)
{
int idx=id[i];
if(idx<=m)getMax(maxf,f[idx]);
else
{
P cur=maxf;
++cur.first;
getMax(f[idx],cur);
}
}
cdq(m+1,r);
}
int main()
{
ios_base::sync_with_stdio(0);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
for(int i=1;i<=n;i++)f[i]=P(1,1);
cdq(1,n);
P ans(0,0);
for(int i=1;i<=n;i++)getMax(ans,f[i]);
printf("%d\n",ans.second);
return 0;
}
3.2 BZOJ 3262 陌上花开
3.3 HDU4742 Pinball Game 3D
参考:
https://blog.csdn.net/tham_/article/details/68555100
bryce1010专题训练——CDQ分治的更多相关文章
- 技巧专题3(cdq分治、整体二分等)
cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...
- bryce1010专题训练——LCT&&树链剖分
LCT&&树链剖分专题 参考: https://blog.csdn.net/forever_wjs/article/details/52116682
- bryce1010专题训练——树状数组
Bryce1010模板 1.一维树状数组 https://vjudge.net/contest/239647#problem/A[HDU1556] #include<bits/stdc++.h& ...
- bryce1010专题训练——LCA
1.Targan算法(离线) http://poj.org/problem?id=1470 /*伪代码 Tarjan(u)//marge和find为并查集合并函数和查找函数 { for each(u, ...
- bryce1010专题训练——Splay树
Prob Hint BZOJ 3323 文艺平衡树 区间翻转 BZOJ 1251 序列终结者 区间翻转,询问最值 BZOJ 1895 supermemo 区间加,翻转,剪切,询问最值.点插入,删除. ...
- bryce1010专题训练——划分树
1.求区间第K大 HDU2665 Kth number /*划分树 查询区间第K大 */ #include<iostream> #include<stdio.h> #inclu ...
- bryce1010专题训练——线段树习题汇总
一.区间查询,无单点更新 hdu2795 Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 ...
- cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )
hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...
- CDQ分治学习笔记
数据结构中的一块内容:$CDQ$分治算法. $CDQ$显然是一个人的名字,陈丹琪(NOI2008金牌女选手) 这种离线分治算法被算法界称为"cdq分治" 我们知道,一个动态的问题一 ...
随机推荐
- RequireJS 配置理解
RequireJS 配置: 1.首先加载RequireJS文件 <script src="//cdn.bootcss.com/require.js/2.1.22/require.js& ...
- hdu-5621 KK's Point(dp+数学)
题目链接: KK's Point Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 编码 —— PCM 编码
PCM:Pulse Code Modulation,脉冲编码调制: 1. 码率的计算 PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM ...
- 魔法少女-dp
魔法少女 Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %I64d & %I64u 前些时间虚渊玄的巨献小圆着实火 ...
- JAVA 需要理解的重点 一
需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程中使用较多) 设计模式(熟悉常见设计模式的应用场景,会画类 ...
- __attribute__((noreturn))的用法
外文地址:http://www.unixwiz.net/techtips/gnu-c-attributes.html __attribute__ noreturn 表示没有返回值 This at ...
- 1.7-1.12 MapReduce Wordflow
一.案例运行MapReduce Wordflow 1.准备examples [root@hadoop-senior oozie-4.0.0-cdh5.3.6]# pwd /opt/cdh-5.3.6/ ...
- c++中stl----vector
1 vector是啥玩意 (1)可以使用下标访问个别的元素 (2)迭代器可以按照不同的方式遍历 (3)可以在容器的末尾增加或者删除元素 2 容器大小和容器的容量区别 (1)大小是元素的个数,容量是分配 ...
- 微信小程序开发之页面wxml里面实现循环 wx:for
js代码: Page({ data:{ upploadimagelist:{}, //上报图片列表 js数组 }}) 后台数据库保存的格式:{"imageList":[{&q ...
- PHP实用小程序(四)
<HTML> <HEAD> <TITLE>访问文件时间属性</TITLE> </HEAD> <BODY> <? $Last ...