摘要: 设f[i]表示还剩i个没买,那么可以有式子f[i] = (n i) / n f[i] + i/n f[i 1] + 1 抽到已经抽到过的,或者是没抽到过的 这个状态其实也可以某方面地说成,抽i个的期望花费,但是我这里抽i个不是随便抽i个,而是说如果存在一种方案,这个方案抽取顺序是1 ~ n,那么从第 阅读全文
posted @ 2018-11-02 21:33 Zolrk 阅读(94) 评论(0) 推荐(0) 编辑
摘要: 因为是两串排列,所以两串值相同位置不同 那么公共子序列要求的就是值相同,而“子序列”要求的是值的位置上升 那么把ab串联系起来,b和a相同的值,位置不同。 设$fb_i$ 为值为bi的数在a串中的位置,显然已经满足相同 那么只要取出一个最长子序列即可,若f值上升,则位置递增,则说明这些bi在a中可以 阅读全文
posted @ 2018-11-02 19:59 Zolrk 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 用树状数组求逆序对的时候注意:要统计b[i] 1的前缀和,因为可能有相同值的元素 不去重离散化: c++ sort(a+1, a+n+1, cmp); for(int i=1; i include include include using namespace std; const int MAXN 阅读全文
posted @ 2018-11-02 18:24 Zolrk 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 这道题是一类树的瓶颈问题。 题意是求两点路径上的最大的最小边(在图中,两点之间路径不只一条),那么肯定这条 最小边存在于最大生成树上 。(反证法证明) 同理, 若求最小的最大边,这条最小边一定在最小生成树上 因此我们可以将图的问题转化为树上问题。树上两点之间的路径一定经过lca,因此这条路我们可以由 阅读全文
posted @ 2018-11-02 16:36 Zolrk 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 对顶堆,维护第k大 考虑维护一个大根堆,一个小根堆。 这两个堆总大小为当前区间长度,我们维护两个性质: 1.小根堆总比大根堆多一个元素 2.小根堆所有元素都大于大根堆元素 这样小根堆的堆顶就是区间中位数。 当需要加入一个新元素时,如果这个元素比小根堆堆顶要大,就加入小根堆中,反之则加入大根堆,这样可 阅读全文
posted @ 2018-11-02 14:38 Zolrk 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 问题是求一个数往右边看,在遇到大于等于他本身的之前,有多少个比他小的数 正难则反,转化问题为一个数能被多少个数看到,算贡献,那么这些的和就是答案 用单调栈去处理,把栈里的比当前处理的数要小于等于的全弹掉,剩下的那些就是严格比这个数大的,也就是可以看到这个数的 ans要开long long c++ i 阅读全文
posted @ 2018-11-02 14:23 Zolrk 阅读(89) 评论(0) 推荐(0) 编辑
摘要: 虽然说通过组合数递推公式可以看出来$C(i,j)=C(i 1,j 1)+C(i 1,j)$ 就是杨辉三角公式,但是还是有一个很关键的差别...就是当j=1时这个公式不太管用...比如说$C_3^1$ 表示从三个东西里面选一个,有三种选法,这个就需要提前处理了... 矩阵前缀和搞一下就好了 求组合数的 阅读全文
posted @ 2018-11-02 14:22 Zolrk 阅读(81) 评论(0) 推荐(0) 编辑
摘要: f(s)表示消灭s集合的小猪所需要的最小数量,考虑到n很小,最大才18,,用二进制来表示状态,0为第i个只小猪没有被消灭,1为第i只小猪被消灭了,就像010001010101这样的,最后求的就是111111111111111这样状态的值 P[i]表示所有可能的抛物线 需要注意的是,每条抛物线能够干掉 阅读全文
posted @ 2018-11-02 14:14 Zolrk 阅读(93) 评论(0) 推荐(0) 编辑
摘要: 直接做多重背包复杂度太高了,我们想想是什么因素限制了如此高的复杂度 如果没有硬币个数的限制呢?直接用完全背包预处理后查询就好了 那么现在考虑一个较为简单的问题,只有一种硬币有限制 设dp[s]为买了价值为s时的方案数,先 暂时当做 完全背包预处理出dp数组 若那个 唯一 被限制硬币的面值为c,个数为 阅读全文
posted @ 2018-11-02 07:29 Zolrk 阅读(116) 评论(2) 推荐(0) 编辑