Bryce1010模板

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&lt;i&amp;&amp;a[j]&lt;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分治的更多相关文章

  1. 技巧专题3(cdq分治、整体二分等)

    cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...

  2. bryce1010专题训练——LCT&&树链剖分

    LCT&&树链剖分专题 参考: https://blog.csdn.net/forever_wjs/article/details/52116682

  3. bryce1010专题训练——树状数组

    Bryce1010模板 1.一维树状数组 https://vjudge.net/contest/239647#problem/A[HDU1556] #include<bits/stdc++.h& ...

  4. bryce1010专题训练——LCA

    1.Targan算法(离线) http://poj.org/problem?id=1470 /*伪代码 Tarjan(u)//marge和find为并查集合并函数和查找函数 { for each(u, ...

  5. bryce1010专题训练——Splay树

    Prob Hint BZOJ 3323 文艺平衡树 区间翻转 BZOJ 1251 序列终结者 区间翻转,询问最值 BZOJ 1895 supermemo 区间加,翻转,剪切,询问最值.点插入,删除. ...

  6. bryce1010专题训练——划分树

    1.求区间第K大 HDU2665 Kth number /*划分树 查询区间第K大 */ #include<iostream> #include<stdio.h> #inclu ...

  7. bryce1010专题训练——线段树习题汇总

    一.区间查询,无单点更新 hdu2795 Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  8. 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; ...

  9. CDQ分治学习笔记

    数据结构中的一块内容:$CDQ$分治算法. $CDQ$显然是一个人的名字,陈丹琪(NOI2008金牌女选手) 这种离线分治算法被算法界称为"cdq分治" 我们知道,一个动态的问题一 ...

随机推荐

  1. mysql general log开启

    #先查看当前状态 mysql> show variables like 'general%'; +------------------+----------------------------- ...

  2. DDD领域驱动之干货(二)

       基于仓储的实现 1.前言:本着第一节写的有些糊涂,主要是自己喜欢实干,不太喜欢用文字表述,就这样吧.下面切入正题. 博客园里面有很多的大佬,我这里就不一一解释概览,有兴趣的朋友可以去看大佬们写的 ...

  3. adb 读写模式 挂载文件系统

    删除需要把system挂载为读写,用到了这篇文章的这个命令: shell@android:/ # mount -o rw,remount yassf2 /system/   完整文章转自:http:/ ...

  4. LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal

    原题链接在这里:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/ 题 ...

  5. 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)

    在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令 ...

  6. Cobbler安装配置简单使用

    安装Cobbler [root@linux-node3 ~]# yum -y install epel-release [root@linux-node3 ~]# yum -y install cob ...

  7. AngularJS系统学习之Module(模块)

    本文源自:http://blog.csdn.net/woxueliuyun/article/details/50962645 学习之后略有所得, 来此分享.建议看原文. 模块是提供一些特殊服务的功能块 ...

  8. Servlet中init-param与context-param的区别

    web.xml文件中Servlet中配置如下: <servlet> <servlet-name>loginServlet</servlet-name> <se ...

  9. sublime配置java环境

    今天突然不想用eclipse编写java了,觉得sublime挺好用,就想用sublime配置java环境,以下是过程以及出现的问题. 一.配置Java环境 1.打开我的电脑–属性–高级–环境变量 2 ...

  10. java命令行从编译到打jar包到执行

     目录: 一. javac编译     1. 没有额外的jar包     2. 包含额外的jar包 二. jar打jar包 三. java运行     1. java命令执行     2. jar包执 ...