Ideas and Tricks Part II
33.对于统计答案幂次的技巧
对于$x^k$,考虑其组合意义:将$k$个不同球放到$x$个不同的盒子里的方案数,直接维护不好维护,那么考虑枚举把这些球放到了哪些盒子里,最后乘上第二类斯特林数和对于的阶乘(保证盒子有序),可以利用一个dp来统计,每次转移的时候考虑是否选择这个盒子$x$
然后这个做法相当于维护了答案的下降幂,由于下降幂优秀的性质
$(x+1)^{\underline{m}}= x^{\underline{m}}+mx^{\underline{m-1}}$
最后利用第二类斯特林数将下降幂转化为普通幂即可
34.解递归式$f_x=af_{x-i}+bf_{x-j}$
考虑其组合意义,相当于是爬楼梯,每一次可以走$i$步代价为$a$,或者走$j$步代价为$b$,总代价为每一步代价的乘积,然后问所有走到$n$的方案的代价总和为多少
可以枚举其中一种步走了多少次
$\sum_{k=0}^{\lfloor \frac{n}{i} \rfloor} [j|n-ik]a^kb^{\frac{n-ik}{j}}\binom{k+\frac{n-ik}{j}}{k}$
当然如果代价是每一步之和也是同理
35.吉司机线段树
势能函数啥的我也没听懂,不管他
吉司机线段树以其优秀的性质可以维护各种duliu信息
然而我只会区间$max/min$(我觉得就这个有点用吧)
以取$min$为例,就是在线段树中维护最大值$MAX_0$,次大值$MAX_1$和相应出现的次数,注意此处的次大值是要严格小于最大值的(如果不存在次大值那么可以将其赋为$-inf$)
当每次更新的时候检查当前节点设当前需要取$min$的是$t$
如果$t \geq MAX_0$那么说这个区间什么也不会发生,那么直接返回
如果 $t \leq MAX_1$那么说明更新的区间内会变化的数不止一个,那么继续递归下去
如果$ MAX_1 < t < MAX_0 $那么这个区间内会被更新的数只有$MAX_0$一个数,那么直接打上减法标记,然后修改$MAX_0$的值为$t$
时间复杂度大概感性理解一下
就是区间取$min$操作会使序列中的数趋于相同,每一次第三种操作更新的时候更新一个数,然后第二种情况递归下去,肯定会减少区间中不同数的数量,这样的区间每次询问最多$log$个,那么就是$nlogn$的复杂度
如果要区间加减,那么就是$log^2n$
36.DP转移状态有互相转移的情况
即DP转移建出来的图里面有环的情况
一句话:利用最短路思想,先把DP的初始状态放入堆中,然后利用状态之间的关系进行转移,跑最短路即可
其实就是废话
37.$(x_1+x_2+...+x_n)^k \equiv x_1^k+x_2^k+...+ x_n^k(\mod k)$k为质数
$\\ \equiv \sum_{\sum k_i=k} \binom{k}{k_1,k_2,...,k_n}x_1^{k_1}x_2^{k_2}...x_n^{k_n}$
$\\ \equiv \sum_{\sum k_i=k} \frac{k!}{k_1!k_2!...k_n!}x_1^{k_1}x_2^{k_2}...x_n^{k_n}$
如果$k_1,k_2,...,k_n$中不存在一个$k_i=k$那么系数中一定存在$k$这个因子,那么取模之后系数就变为$0$
那么上式得证
38.状压DP的优化
对于一些分层枚举的状压DP,往往是需要枚举子集进行转移,时间复杂度为$O(3^n)$
有一种方法可以优化到$O(n2^n)$,枚举子集可以换成尝试将一个点一个点加入到集合中,可以做$0/1$背包来进行转移,但空间需要多开一维
39.拆分数优化DP
对于一些指数级别的DP,可以转化枚举某一个集合中具体是哪些元素为枚举集合的大小,当然这是在保证集合中的数是等价的情况,然后这个DP复杂度就变为拆分数级别的复杂度,一般来说可以跑$40-50$的数据规模
40.询问集合中第$k$大/小
就是给定一种生成某一集合的方法,一般是给出一个序列每一个数可选可不选,问集合中第$k$大的数是多少,往往这个集合是巨大的(指数级别),有一种方法可以从小到大构造出集合中的数
先把序列排好序
设二元组$(sum,id)$表示当前操作出来的数为$sum$,并且当前考虑到序列中第$id$个数的状态,并且第$id$个数必选
然后可以进行转移
$(sum,id)\rightarrow (sum+a[id+1],id+1)$
$(sum,id)\rightarrow (sum+a[id+1]-a[id],id+1)$
相当于是进行$0/1$背包的过程,这个二元组可以用堆来进行维护
如果可以选多个,那么多一个转移
$(sum,id)\rightarrow (sum+a[id],id)$
相当于在做无限背包
再拓展如果每一个数有一个选择上限,那么需要用三元组来记录状态即$(sum,cnt,id)$其中多出来的$cnt$表示当前这个数选了$cnt$次,其他转移同理进行即可
再再拓展每一个数有一个下限和上限,那么在三元组的基础上,在进行转移到下个数的时候,选下限个数即可,就可以保证满足限制了
Ideas and Tricks Part II的更多相关文章
- Ideas and Tricks
1.树上拓扑排序计数 结论$\dfrac{n!}{\prod\limits_{i=1}^n size_i}$ 对于节点$i$,其子树随意排序的结果是$size[i]!$ 但$i$需要排在第一位,只有$ ...
- USB hacker Collection
This blog contains some ideas and tricks about USB hacking.
- Recurrent Neural Network系列2--利用Python,Theano实现RNN
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- 34 Sources for Test Ideas
We recommend collecting test ideas continuously from a variety of information sources. Consider the ...
- 10 Interesting Linux Command Line Tricks and Tips Worth Knowing
I passionately enjoy working with commands as they offer more control over a Linux system than GUIs( ...
- PID控制器(比例-积分-微分控制器)- II
Table of Contents Practical Process Control Proven Methods and Best Practices for Automatic PID Cont ...
- Blog Ideas
Blog Ideas How-to Post Case Studies Product + Service Updates Product Reviews Content Survey Current ...
- Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
- Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II
题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...
随机推荐
- Java安全之URLDNS链
Java安全之URLDNS链 0x00 前言 在学习Java的反序列化漏洞的时候,就不得不学习他的一个利用链.很多刚刚入门的对于利用链这个词可能比较陌生.那么这里先来了解一下Java反序列化和反序列化 ...
- 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字
084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字 本文知识点:构造方法-this关键字 说明:因为时间紧 ...
- 【比赛记录】8.21 div2
A 选择一个点\(B(x,0)\)使得\(|dis(A,B)-x|=k.\) 题目实际上就是找到一个最接近\(n\)的数,使得它可以分成两个数\(a,b,\)使\(a-b=k.\) 我们考虑先分成一个 ...
- Charles 模拟弱网
1.Charles安装方法: 1)在官网下载安装: 2)输入如下注册码破解,Charles 4.2.7 目前版本,可用. Registered Name: https://zhile.io ...
- H264裸码流I/P/B帧类型判别
花了两天时间做了个h264裸流nal类型和frame类型检测的工具,已上传至github,有需要的自行下载. 1.NAL类型检测 nal类型检测非常容易,对照下表即可容易判断类型. 较常用nal类型包 ...
- Android HandlerThread 详解
概述 HandlerThread 相信大家都比较熟悉了,从名字上看是一个带有 Handler 消息循环机制的一个线程,比一般的线程多了消息循环的机制,可以说是Handler + Thread 的结合, ...
- pytest文档57-计算单元测试代码覆盖率(pytest-cov)
前言 我们在做测试的时候,经常遇到领导的灵魂拷问:你的测试用例覆盖率是多少,达到100%了么?你如何保证你的测试质量? 测试用例的覆盖率如何统计呢,如何知道开发的代码,我们都测到了,不会存在漏测的情况 ...
- 联赛%你测试10T2:漫无止境的八月
题意: 思路: 有几个特殊的性质: 在不考虑q里面的单点修改,我们先只判断一个序列是否Yes. 我们注意到每次操作都是对一个长度为k的区间进行区间加减1的操作,所以我们如果将序列里面的数按%k分组,把 ...
- centos8平台使用strace跟踪系统调用
一,strace的用途 strace 是最常用的跟踪进程系统调用的工具. 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectfore ...
- 2019-2020-1 20209313《Linux内核原理与分析》第二周作业
2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...