Code: #include <cstdio> #include <algorithm> #include <cstring> #define maxn 200000 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,ans[maxn],hh[maxn]; inline void getmax(int &a,int b){ if(b&…
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 6 3 9 9 8 7 7 6 样例输出 3 题解 CDQ分治+树状数组 一道经典的二维偏序问题. 由于限制条件有2维,所以我们可以使用CDQ分治处理第一维,用树状数组维护第二维. 具体地,按照CDQ分治的思路,先处理左半部分的答案,再处理左边对右边的影响,最后再处理右半部分的答案. 处理左边对右边的影响时…
题面 Description 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. Input Output Sample Input 8 1 3 3 2 1 1 4 5 6 3 9 9 8 7 7 6 Sample Output 3 HINT 数据范围100000 解题思路 CDQ分治.其实跟模板题的思路差不多,就是用树状数组维护\(dp\)最大值.注意一下更新的顺序,就是要从左边往右边更新,所以应该先向左分治,…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2225 [题目大意] 给定N个数对(xi,yi),求最长上升子序列的长度. 上升序列定义为{(xi,yi)}满足对i<j有xi<xj且yi<yj. [题解] CDQ分治,将每个区间按照a排序,用区间左边的数据来更新右边的最长上升序列, 为排除a相等但是b上升情况的误统计,在排序时加入下标作为第二关键字, 使得a相等的情况下标小的后更新. [代码] #include <cs…
这道题 连续上升的三元组 且已经按照第一维排好序了. 直接上CDQ分治即可 当然也是可以2-Dtree解决这个 问题 但是感觉nlog^2 比nsqrt(n)要快一些.. 算是复习一发CDQ分治吧 也好久没写了. 原来最长三元上升序列 不是裸的CDQ分治..我以为是 没细想 最后还是细想了一下实现方式. 首先CDQ左边 然后对于右边此时x是无序的 考虑排序 在外面排序没用好吧.. 好吧可能有用但是太过繁琐那种写法 这里推荐暴力sort..归并没用 因为归并此时复杂度还是nlogn的. 统计完左边…
BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description        给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. Input Output Sample Input 8 1 3 3 2 1 1 4 5 6 3 9 9 8 7 7 6 Sample Output 3 HINT 数据范围100000 有点烦的一道题. 有D…
HDU4742 CDQ分治,三维LIS 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4742 题意: 每个球都有三个属性值x,y,z,要求最长的lis的长度和方案数 题解: 一维LIS很好求,dp一下就行 二维的LIS,将第一维排序后,和第一维一样 那么三维的lis怎么做了,我们很容易想到将第一维排序后分治的写,分了后, 按照y排序,怎么治呢?用树状数组更新前前x的最大值,然后再用dp更新即可 这里需要注意,和陌上花开等板子题不一样,我们这里不能分…
Another Longest Increasing Subsequence Problem Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=19929 Description Given a sequence of N pairs of integers, find the length of the longest incre…
题目链接  LIS2 经典的三维偏序问题. 考虑$cdq$分治. 不过这题的顺序应该是 $cdq(l, mid)$ $solve(l, r)$ $cdq(mid+1, r)$ 因为有个$DP$. #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --…
分析 这回试了一下三级标题,不知道效果怎么样? 回到正题,二维最长上升子序列......嗯,我会树套树. 考虑\(CDQ\)分治,算法流程: 先递归进入左子区间. 将左,右子区间按\(x\)排序. 归并处理左右子区间,在过程中使用树状数组加速\(DP\). 还原右区间,清空树状数组. 递归进入右子区间. 代码 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring>…