提高组
两天的难易程度都是1-3-2
Day1
toy
乱搞模拟
running
首先对于一个人(s,t),我们把这条路径拆分为(s,lca)与(lca,t),其中lca为s与t的最近公共祖先
先看(s,lca)这一类,对于一个节点x,一个x的子树中的节点y,只要满足
d[y]−d[x]=w[x]
且x是lca(s,t)的子树中的点,那么ans[x]++.
d[y]−d[x]=w[x]
d[y]=w[x]+d[x]
现在成了一个经典的问题: 在x的子树中存有多少个d[y]
但注意到如果路径(s,t)在x的子树中但不经过x,ans[x]是不能+1的,所以对于路径(s,lca),我们分别在s与lca打一个+d[y]与-d[y]的标记.然后dfs一遍统计答案.因为对于节点x我们只关心一个值,所以开始时记录一下值,返回时减掉就是x的子树中新增的值.
对于(t,lca)同理,需要注意的是特判lca也能观察到的情况.
classroom
首先我们不难发现,这个期望值是可以相加的.即上完第i节课所用的期望值加上从第i节课的课室到第i+1节课的课室的期望就等于上完第i+1节课的期望.因为他们是互不影响的.
然后这就变成了一道很简单的dp.
day2
problem
杨辉三角形+矩阵前缀和预处理,O(1)回答询问.
earthworm
首先暴力就是打一个堆,然后维护堆内的值全部与真实值差i*q
q=0的做法就是有每一次分解出来的x和y都会比下一次的x和y的大.所以维护一个链表两个指针处理插入就OK了.
然后正解就是合并一下,维护链表中的值全部与真实值差i*q.分解出来的x,y减掉i*q后依旧是单调不增的
angrybirds
状压DP.
首先n^3处理出
Gi,j
表示打i和j这一条抛物线的时候能顺带打下多少,压起来.
然后还能发现就是无论如何总要打掉第一个没被打掉的,那就在当前这一次打掉.
然后就是2^n*n^2的DP了.
普及组
T1,T2不说了 (虽然打完就交都只有70分)
T3
简单模拟一下,用一个指针维护一天内的人,再开一个桶维护人数.
T4
设d-c=x,那么b-a=2x
然后c-b>6x
然后枚举x,O(n)预处理一下c+d=x的组数,再枚举a,计算ansa,ansb.再枚举d,计算ansc,ansd.
这样就是O(n^2)的暴力,能有95分.
对于最后一个点,我们观察发现x最大能取到n/9.