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. [noi2002]荒岛野人 拓展欧几里得

    克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi个洞住下来 ...

  2. Java8初体验(1):lambda表达式语法

    原文出处: 一冰_天锦 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化 ...

  3. requireJS 加载css、less文件

    -- requireJS 同样可以加载css 文件,有require-css的插件,只需要把插件放入main.js同文件夹,在依赖处 采用 ‘css! test.css’的形式就可以加载css文件 - ...

  4. BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心

    BZOJ_4010_[HNOI2015]菜肴制作_拓扑排序+贪心 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜 ...

  5. [SDOI 2015] 星际战争

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3993 [算法] 首先发现问题具有单调性 , 不妨二分答案mid 考虑网络流 : 将源 ...

  6. oracle获取一段时间内所有的小时、天、月

    获取一段时间内所有的小时 ) sdate FROM dual CONNECT ; 获取一段时间内所有的天 sdate FROM dual CONNECT ; from user_objects whe ...

  7. C/C++获取操作系统、CPU、内存信息(windows和linux)

    有时候需要在工程里面获取一些系统或者硬件的信息,比如系统版本,cpu,内存,显卡,硬盘等,作为后续软件功能判断的依据,甚至参与性能算法自适应建模 Windows 操作系统和内存信息在windows下通 ...

  8. 生产环境下JAVA进程高CPU占用故障排查---temp

    问题描述:生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高. 问题分析:1,程序属于CPU密集型,和开发沟通过, ...

  9. .NETFramework:Timers

    ylbtech-.NETFramework:Timers 1.返回顶部 1. #region 程序集 System, Version=4.0.0.0, Culture=neutral, PublicK ...

  10. vue-element el-select value-key

    如果select绑定的值为对象,请务必指定value-key为它的唯一性标示 demo: data(){ return{ test:'', arr:[{id:1,name:'张三'},{id:2,na ...