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分治" 我们知道,一个动态的问题一 ...
随机推荐
- BestCoder Round #92 1002 Count the Sheep —— 枚举+技巧
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=748&pid=1002 题解: 做题的时候只是想到 ...
- mysql初始化命令及其他命令
这个问题纠结了我两年: 为了配置my.cnf中 undo的 参数生效,以及生成undo文件,使用一下命令 /usr/bin/mysql_install_db --defaults-file=/et ...
- cnn汉字识别 tensorflow demo
# -*- coding: utf-8 -*- import tensorflow as tf import os import random import tensorflow.contrib.sl ...
- Vue表格数据增删改查及搜索
<div id="app"> <div class="item"> <span class="name"> ...
- 51Nod - 1055:最长等差数列 (求最长的等差数列)
N个不同的正整数,找出由这些数组成的最长的等差数列. 例如:1 3 5 6 8 9 10 12 13 14 等差子数列包括(仅包括两项的不列举) 1 3 5 1 5 9 13 3 6 9 12 ...
- [YNOI 2016] 掉进兔子洞
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4939 [算法] 不难发现 , ansi = (r1 - l1 + 1) + (r2 ...
- 关闭页面,window.onunload事件未执行的原因
1.问题描述: JS中定义widow.onunload= function(),页面关闭时,logout()函数未执行. window.onunload = function() { logout() ...
- Jquery获取web窗体关闭事件,排除刷新页面
在js脚本里全局定义一个 var r=true;若是刷新的话则把r=false; $(window).unload(function () { if (r) { //这里面证明用户不是点的F5刷新 执 ...
- Bayesian 网络分类算法
1:贝叶斯网络的定义和性质 一个贝叶斯网络定义包括一个有向无环图(DAG)和一个条件概率表集合.DAG中每一个节点表示一个随机变量,可以是可直接观测变量或隐藏变量,而有向边表示随机变量间的条件依赖:条 ...
- Jacob开发文件转PDF
这三种方法我都有试过word转PDF,第2种.第3种对于图片,表格.中文转换效果都不好,方法1效果最好.但方法1 只支持Windows环境下. 1.开发环境 Windows系统: 2.准备工作: st ...