10.1
T1:即使我得出了正解的式子,但是也没有想到怎么去用那个式子.看来自己对于一些线性的式子能不能转成线段或者数点问题还不敏感,以后遇到这类问题还是得多往这个方面去想.
这道题的做法是直接将式子转成区间,区间取最多的区间不相交,贪心一下就好了.
T2.完全就是看能不能发现题目的妙处,对于
sqrt
和
mod
一类的是不超过
O(n√)
和
O(log2n)
次就能得到1,然后继续就没有意义了,某种套路…
T3.其实自己对于这种发现性质的题目并不是非常擅长,而且又是一道比较难的数学题,组合数学不好,性质又发现不了,根本无从下手啊.看来还是得加强这方面的能力.
本题做法是考虑答案是单调的,二分或贪心判断一下.
10.2
T1:这一题就是一道送分题,但是我都没拿到.自己对DP理解还是不是很透彻,对于有后效性的状态,新加几维来记录有后效性的状态,然后消除后效性.但是自己对于这些东西理解还不够,一直认为
?
的取值后效性即使加了状态也消除不了(那我加如新状态有什么用).我好垃圾啊!!
T2:这一题我就很无语了,自己在那乱搞,还少考虑了一些东西,导致自己这题爆成了20分.其实这一题是黑书上原题(看书看得少,不会做).这道题的想法其实都想到了,只是具体的实现不知道用什么较好,对于问题的分析还不够,也就没有想到什么好的做法.有时候一些算法去变一下形就可以得到一些很好实现方法.
用最短路的方法从外向内更新,然后用floodfill来覆盖不合法的点,找到每个点的最大高度可以为多少.
T3:这题其实自己是搞出了正解,
但是自己对于容斥原理的复杂度
10.3
T1:这一题其实也想到了正解,但是自己却对于它的暴力程度十分震惊,没有去细算时间复杂度,就只写了暴力.但是用线段树去模拟,这是一个从来没有接触过的操作方法,看来很多看上去很暴力的东西(如启发式合并,长链剖分)我都默认为会T,但是就是可以过….挺无语的.
T2:这题是一个挺巧妙的DP题,用其中的对于两个状态都需要表示出来,但是两个状态之间又存在某种关系,可以优化掉状态中的一维.
这道题中左边1的个数与右边越过当前界限的个数加起来是不大于枚举的列数,所以就可以省掉其中的越过当前界限的个数的那一维,转为间接的统计答案.
T3.对于题目中一些难处理的式子,可以通过找规律等方法来发现它的实质,反正它也得有个方法去处理.这样处理后题目就会得到转化,然后发挥自己的能力,一般都会做出来吧.
找规律发现那个神奇的式子就是将最高位变成最低位的轮换一次,然后发现只出现0或1的位置一定可以贪心的搞成1,否则就只能是0.用trie搞一下就可以了.
10.4
T1:套路题啊!但是不会…约瑟夫问题,只要会递推式就可以做了.
递推式:
g(n,k)=⎧⎩⎨⎪⎪0,(g(n−1,k)+k)modn,⌊k(g(n′,k)−nmodk)modn′)k−1⌋,whereif n=1if 1<n<kn′=n−⌊nk⌋,if k<=n
T2:直接拆式子,但是没有发现可以用线段树维护(乘法分配率没有发现).
T3:最长公共上升子序列.套路题!具体的做法就是:
定义
dpi,j
为
a
匹配到
首先可以发现的是,当且仅当
ai=bj
时,
dpi,j
才可以由前面的状态转移过来(同时保证递增).然后我们可以通过
O(n4)
来暴力枚举.
其次我们可以发现一些性质:
当
ai!=bj
时,
dpi,j=dpi−1,j
,由于前面的必然存在一个
ak
(
k<j
)
=
当
ai=bj
时,
dpi,j=max(dpi−1,k+1)
(
k∈[1,j−1]
&
bk<bj
),由于最优的转移状态一定是由
i−1
转移过来,所以可以只考虑它.而且这
dpi−1,k
可以由之前的状态得到.通过首先枚举
i
然后再枚举
10.5
T1:状态压缩DP,直接用
dpi,j
表示前
i
层,
T2:随机题(其实就是证明复杂度的题目),还是得有梦想去骗分.
T3:巧妙的贪心.
据
dyy
所说,考虑每个点离它距离为
j
的剩余灭火次数,以及还有多少个需要处理,然后贪心处理最大距离
10.6
T1:看到题目后就没去仔细想,其实去搞应该会有80分.
80分做法是二分答案加判断.
其实正解做法就是可以考虑不用二分答案,其实答案就是在上边界到下边界的最小生成树上的最大边.
T2:据说这题是极长上升子序列的最小花费,其实就是能加入的边就必须加(在保证极长时,找出花费最小的一条极长).
定义DP状态为
fi
为考虑到左边第i个点时,极长上升子序列的最小花费.
其实更好理解的方式就是转为二维平面上的点
(i,pi)
.
从横坐标
n
枚举到
考虑枚举右上角那一块的纵坐标,维护一个递减的序列.然后用递减的序列更新答案.
复杂度为
O(n2)
.
考虑用线段树维护递减的区间,只需要记录最低的那个节点以及花费和.同时维护右区间的答案以及最低节点,合并的时候讨论一下.
T3:斜率的形式,用凸包维护,答案就是凸包的切线,这个考场上就想到了,只是暴力弹栈在数据随机的情况下是
O(log2n)
,但是一组精心构造的数据可以轻易卡掉.所以可以用可持久化栈(其实就是一棵树)来维护,然后插入时可以倍增二分来找到那个节点,这一段的东西是会被弹掉的,所以可以直接接在那个节点下面.
10.7
T1:答案其实等价于又多少个数期望在
a1
前面,直接用期望的线性性拆掉答案,变成每个数出现在
a1
前面的期望(概率),直接计算答案即可.
T2:这题DP比较晦涩.
dpi,j,k,l
表示到第
i
个数字,有
然后考虑上一位和当前为,如果当前位为2,则
j
必定会减少1,特判转移.
如果是0或1,考虑上一位是什么,直接转移.
最后由于0或1向前面或后面丢时是没有考虑是否存在一个1或0的堆.所以还需要特判一下.
T3:三维计算几何,看到后我就不想去搞了.
但是其实并没有想象的那么难.首先我们可以由欧拉定理
10.8
T1:完全没有什么想法.
其实对于每一个联通块,考虑它的最小生成树,然后对于不在树上的边,任意分配给一个点,对于生成树中奇数的点,就把与父亲的连边给这个点,否则就分配给父亲,这样一定是最优的.
T2:其实比较迷.
考虑用
api=i
,而字典序最小,就是使
a1
尽量小时,
a2
尽量小…
且此时只需要判断相邻 两个数能否交换就好了.找到前面所有满足
|aj−ai|>=k
(j<i)
,连边.发现此时是一个
DAG
图,然后拓扑排序一下,就可以得到一个最优解.但是如果暴力直接连边则会有
n2
级别的边的数量.考虑如何优化.其实只需要向前满足
aj−ai>=k
和
ai−aj>=k
的第一个点,只需要与它连边(更前面的点一定会存在从
j
连到
T3:就是最小割树的退化版.考场上就想到了正解,没有推完那个式子.
60分暴力的标准做法是考虑每个联通块(最开始是一个),任选两个点跑最小割,然后割成两个集合,继续递归的搞,最后把边权相加即可.
100分观察一下60分暴力,可以发现就是所有边权和.考虑为什么,我们考虑经过某个点进出它的所有子树的最优方案,就是从大到小经过每一条边(就是边权大的边出现在最小割的次数一定是小于等于边权小的边的,所以满足取等时一定最优,即每条边恰好经过一次),递归下去就是把每条边的边权加起来.