HDU5324 cqd分治
HDU5324 cqd分治
标签(空格分隔): 未分类
给你两个长度相同数列,求第一个不上升,第二个不下降的最长子序列长度。
这里要求的子序列对第一个和第二个来说是相同的。即如果你在第一个序列里选了第i个,那么在第二个序列里也要选第i个。
首先我们考虑怎么解决只有一个序列的情况。
这就是最普通的最长不下降子序列。考虑\(O(nlogn)\)的做法。
首先仍然是DP,$f[i]=\max(f[j]+1) , j < i $ & $ a_j < a_i \(. 我们需要考虑怎么在\)logn\(时间内求出\)\max(f[j]+1)$.这很容易。对于i,我们建立一颗权值线段树,每次单点修改,求区间最大值即可。(可以用zkw)
那么我们考虑如何解决这个二维问题。首先DP方程还是这样。
\[f[i]=\max(f[j]+1) , j < i , a_j > a_i , b_j<b_i \]
问题在于如果我们想用\(log\)的复杂度维护这个\(\max(f[j]+1)\),我们就需要一个二维线段树,这是非常令人难过的。因为首先二维线段树不好写不好调,而且更关键的是很容易MLE(或者TLE?)。
那么这类二维数据结构问题都可以考虑使用cdq分治。
cdq分治的基本思想就是把所有询问离线统一计算,这样我们就可以在计算的时候进行分治。
其实多数情况下就是把所有位置上的答案都计算出来。
所以cqd分治的第一个条件就是允许离线。
以这道题为例,我们考虑计算所有的\(f[i]\).如果用\(gao(1,n)\)表示计算\(f[1]\)~\(f[n]\),那么\(gao(1,n)\)就可以分成\(gao(1,n/2) , gao(n/2+1,n)\),这样我们就可以分治了。
当然直接分治是不对的,因为一个\(f[i]\)是受到他之前所有的\(f[j]\)的影响的。这在\(gao(1,n/2)\)时没有问题,但是在\(gao(n/2+1)\)时就会少考虑前一半对这一半的贡献。
那么很好办,cqd分治和普通分治的主要区别就是我们可以在\(gao(1,n/2)\)之后用\(O(n)或者O(nlogn)\)时间把前一半已经计算出来的\(f\)值对后一半的影响加进去。这样总体复杂度就是\(O(nlogn)\)或者\(O(nlog^2n)\)。具体复杂度取决于合并时的复杂度。
注意这里有cdq分治成立的第二个条件,那就是前一半对后一半的贡献是可以独立计算的,而且后一半不会影响前一半。否则没办法合并。
对于这道题而言,我们\(gao(1,n)\)的时候,先计算前一半,然后把前一半和后一半的数分别排序,对于后一半每个数,把前一半里比它小的插入线段树中,然后查询权值线段树中的最大值即可。合并复杂度\(O(nlogn)\),总体复杂度\(O(nlog^2n)\),和二维线段树一样,但是好写多了。
另外这道题要求答案字典序最小,那么DP的时候倒序做就可以了。(想一想就懂了)
实际上cdq分治就是在一个维度上改变了求解问题的顺序,从而避免了对整体使用二维数据结构。
HDU5324 cqd分治的更多相关文章
- [Hdu1166]敌兵布阵(CQD分治)
CQQ分治 Code #include <cstdio> #include <cstring> #define N 50010 struct info{ int x,p,v; ...
- CQD(陈丹琦)分治 & 整体二分——专题小结
整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料: 整体二分是个很神的东西 ...
- HDU5730 Shell Necklace(DP + CDQ分治 + FFT)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5730 Description Perhaps the sea‘s definition of ...
- bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】
模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...
- SPOJ:Another Longest Increasing Subsequence Problem(CDQ分治求三维偏序)
Given a sequence of N pairs of integers, find the length of the longest increasing subsequence of it ...
- maomao的每日动向
\(2019.02.04\) \(Nothing\) \(to\) \(do\). \(2019.02.05\) - 早上睡到\(12\)点 - 中午下午:吃饭串门拜年 - 晚上:吹爆<流浪地球 ...
- P4027 [NOI2007]货币兑换
传送门 首先有一个显然的贪心,每次操作都要做到底,为了最优不会出现只卖一部分或者只买一部分的操作 所以设 $f[i]$ 表示前 $i$ 天得到的最大价值,那么对于每一个 $i$,枚举所有 $j< ...
- [2015hdu多校联赛补题]hdu5324 Boring Class
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5324 题意:给你一个二维的序列,让你找出最长的第一维升第二维降的子序列(如果多个答案,输出字典序最小) ...
- 浅谈CDQ分治与偏序问题
初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...
随机推荐
- 十个技巧迅速提升JQuery性能
本文提供即刻提升你的脚本性能的十个步骤.不用担心,这并不是什么高深的技巧.人人皆可运用!这些技巧包括: 使用最新版本 合并.最小化脚本 用for替代each 用ID替代class选择器 给选择器指定前 ...
- Zipline入门教程
Zipline Beginner Tutorial Basics 基础 Zipline is an open-source algorithmic trading simulator written ...
- Linux下的信号机制
2017-04-06 之前在看LinuxThreads线程模型的时候,看到该模型是通过信号实现线程间的同步,当时没有多想,直接当做信号量了,现在想起来真是汗颜……后来想想并不是那么回事,于是,就有了今 ...
- Python 有什么奇技淫巧?
知乎上有一个问题:Python 有什么奇技淫巧?其中有各种不按套路出牌的招数,也不乏一些惊为天人的"奇技淫巧",会让你大呼:居然还有这种操作??? 本文就是对日常使用过的或者觉得很 ...
- 007-aven-assembly-plugin和maven-jar-plugin打包,java启动命令
一.需求 打一个zip包,包含如下: bin为程序脚本,启动和停止 lib为依赖包 根目录下为配置文件和项目jar包 二.知识储备 2.1.插件了解 plugin function maven-jar ...
- SpringBoot简介及第一个应用
一.Spring时代变换 1. Spring1.x 时代 Spring初代都是通过xml文件配置bean,随着项目的不断扩大,繁琐的xml配置,混乱的依赖关系,难用的bean装配方式,由此衍生了spr ...
- python subplot 合并子图的方法
- st试用笔记
1.关于轮询 我的写法: var time_count = 0; var timer = setInterval(function(){ async.ajax({ url:'', data:'', s ...
- C#中获取音频文件时长
1.在项目中添加引入:COM组件的Microsoft Shell Controls And Automation 2.在引用中找到Shell32,点击右键,在属性中将“嵌入互操作类型”的值改为“fal ...
- 001-navicat for oracle 12 破解安装
1.首先软件包和破解文件都需要到我给的百度云盘地址下载,去官网下载的中文版破解不了,至于官网的英文版,我就不清楚了. (1)链接地址. https://pan.baidu.com/s/1jxj4uzg ...