归并排序 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。 //将有序数组a[]和b[]合并到c[]中 void merge(int a[], int n, int b[], int m, int c[]) {int i, j, k; i = j = k = 0; whi
其实就是扩展归并排序。 适用于处理偏序问题。 算法 对于三维或以上偏序,我们采用CDQ分治。 第一个思想是排序。 先使第一维有序,然后将区间分成两半后两边各自按第二维排序,可以保证左一半的第一维小于右一半。 然后就可以对左右做类似归并排序的事情,用左边更新右边的答案。 更新过程中用树状数组保证第三维有序。 时间复杂度 O ( l o g n ∗ n l o g n ) = O ( n l o
题目描述: 小 Y 最近在一家金券交易所工作。该金券交易所只发行交易两种金券:A 纪 念券(以下简称 A 券)和 B 纪念券(以下简称 B 券)。每个持有金券的顾客都有 一个自己的帐户。金券的数目可以是一个实数。 每天随着市场的起伏波动,两种金券都有自己当时的价值,即每一单位金券 当天可以兑换的人民币数目。我们记录第 K 天中 A 券和 B 券的价值分别为 AK 和 BK (元/单位金
题目链接:传送门 对于每个敌方的人形兵器,记录一个 B B B,表示多少次能够打死这个人形兵器。 易知 B i = ⌈ D i A T K ⌉ B_i=\lceil\frac{D_i}{ATK}\rceil Bi=⌈ATKDi⌉。 首先考虑没有秒杀的情况: 显然应该按照某个顺序打死所有人形兵器(不可能打人形兵器A打到一半突然开始打B),所以考虑什么时候交换人形兵器 i , i + 1 i,
题目链接:传送门 洛咕传送门 令 s u m w sumw sumw表示 w w w的前缀和。 显然的 d p dp dp方程: d p [ i ] = m i n ( d p [ j ] + ( h [ i ] − h [ j ] ) 2 + s u m w [ i − 1 ] − s u m w [ j ] ) dp[i]=min(dp[j]+(h[i]-h[j])^2+sumw[i-1]-
题目链接: bzoj2726 洛谷2365 洛咕上好像 O ( n 2 ) O(n^2) O(n2)能过……还没有负数的情况…… 如果没有负数,就直接大莉上斜率优化就珂以了qwq 转移方程是 d p [ i ] = d p [ j ] + s u m T [ i ] ∗ ( c [ i ] − c [ j ] ) + S ∗ ( c [ n ] − c [ j ] ) dp[i]=dp[j]+s
分治、CDQ分治小结 A Summary for Divide and Conquer 0. Anouncement 本文部分图片以及部分内容来自互联网,内容过多就不一一注明出处了,冒犯之处还请海涵。 Some of the pictures and the content of the text come from the Internet. Due to plenty of th
这道题显然有一个可持久化线段树的做法。 首先我们意识到这个极广的值域没有什么用处。 我们首先想到必然存在一个 x \ x x使答案为 x \ x x或者 [ 1 , x − 1 ] \ [1,x-1] [1,x−1]中的最小的不存在的数字。 所以首先我们想到找到这个 x \ x x然后把没有必要的数字全部删掉,这样剩下的数字必然再 [ 1 , n ] \ [1,n] [1,n]中。
三维偏序 luogu 3801 金牌导航 CDQ分治-1 题目大意 有n个元素,第i个元素有 a i , b i , c i a_i,b_i,c_i ai,bi,ci三个属性,设 f(i)表示满足 a j ⩽ a i a_j\leqslant a_i aj⩽ai且 b j ⩽ b i b_j \leqslant b_i bj⩽bi且 c j ⩽ c i c_j \leqsla
CDQ跑的比分治快得多 首先 我们可以把每一个点看成一个三元组(x, y, z) x 表示它当前的值 y 表示的在序列中的编号 z 表示它的时间 即第z次操作后的这个点 所以 如果某个点P在平面上的左上方有点(值小于P并且位置在P之后) 后者右下方(恰好相反)的地方有点 就会形成一个逆序对 在一开始我们很容易求出每一个点形成的逆序对总数 每次删除的时候从ans中减去 然而 在CDQ分治的过