T1 病毒感染
求出一张图,上的能从它出发一直覆盖整张图的所有点
说人话,其实我所给定的图的类型全部是树,所以说这个问题也就相应的转化为求树的重心,而树的重心的求法,我就不过多赘述了,详见代码
T2 切题之路
阅读理解题
T3 神秘钥匙
水题,显然可知答案是
∑i=1nCni∗i
将样子改变一下可以得到
∑i=1nCni=∑i=1ni!(n−i)!n!∗i=∑i=1n−1Cn−1i∗n=n∗2n−1
所以说最终答案是n∗2n−1
T4 迷之盒子
把题目转化为人能理解的样子
有一个方程
x1+x2+x3+…+xn=m
保证每个xi<=k ,求这个方程有几组解。
T5 诡异数字
数位Dp
要注意一点,约束取min ,剩下的应该比较简单了。
T6 数列操作
可能有些在同学bzoj或者tyvj上见过类似的题目,简单的说这是一道平衡树的模板题目, (模板题目过多会不会被喷啊QAQ)
所有的操作都可以用splay或者Treap来维护,而出题人不会Treap所以就打了一个Splay的板子QAQ
T7 红包期望
sqn发了
T8 机房网络
一个点到另一个点的最大流量就对应着最小割。也就是说必须要在左边割一条边,在右边割一条边假设左边这条边靠近1的点是a ,右边割的边靠近n的点是b那么所有连接1−a,b−n的点都要被割掉
也就是说,左边哪一条边作为割时 ,对应的最小流量是固定的,这样取一个最小值就是最小割。
我们发现这样可以把一种割分为两部分 :
1、左边的一条边的权值
2、选这条边作为割,中间及右边的割产生的最小值
所以我们现在要维护的就是左边每一条边作为割时 ,中间及右边的割产生的最小值。也就是要在右边选一条边作为割,使得中间的对应边和右边的这条边的和最小。
考虑这个如何维护。建一棵线段树 ,首先对其中结点赋值,为右边每条边的边权,表示在右边选这一条边为割所产生的权值,注意因为边有可能直接连到汇点,所以要增加一个权值为0的边。
然后我们从1−n将左边的边逐一进行考虑,每加入一条边,中间就会多一些边连向右边, 加入左边一条边时,枚举当前点连向右边的所有边, 我们将线段树中e.to−n这个区间内加上这个边的值,表示左边当前边再往下的边作为割时都要考虑当前加入的这些边。可以看出每次加入左边一条边并更新完线段树后,线段树中的最小值在加上这条边的权值, 就是这条边所对应的最小割。
用这种方法就可以求出,左边每条边作为割时,所对应的最小割的值。
考虑求答案,我们将求出来的这些值维护成一棵线段树,显然其中的最小值就是最小割,那么对于询问怎样维护。
由于我们求的是左边每-条边作为割所时所对应的最小割,所以这时候修改左边边的值也就可以直接修改
了,这样直接修改线段树,然后输出最小值就可以了。
T9 路灯孤影
设dp[i][j][k]表示到第i盏灯(按位置从左到右) , 最左边的需要覆盖到的位置是j(0代表不存在未覆盖)
最右端位置是k ,包括了这段实际没有覆盖的最大总长度。
考虑转移:
向右照射,且之前的最左边需要覆盖的位置不变,转移方程:
dp[i][j][max(R[i],k)]=max(dp[i][j][max(R[i],k)],dp[i−1][j][k]+max(0,R[i]−k]))
向左照射,且覆盖掉了原来实际没有覆盖(或者原来没有未覆盖)的部分,转移方程:
dp[i][0][max(p[i],k)]=max(dp[i][0][max(p[i],k)],dp[i−1][j][k]+max(0,p[i]−k]))(L[i]≤j)
向右照射,且原来没有未覆盖部分,最右边位置在当前灯位置左边,取最右边位置后某一处j到当前位置作为假装覆盖实际没有覆盖部分(或者不选取) , 转移方程:
dp[i][k][R[i]]=max(dp[i][k][R[i]],dp[i−1][0][j]+R[i]−k)(j≤k<p[i])
向左照射,且原来没有未覆盖部分,最右边位置在当前灯照射左边界左边,取最右边位置后某一处j到当前位置作为假装覆盖实际没有覆盖部分(或者不选取) , 转移方程:
dp[i][k][max(x[i],j)]=max(dp[i][k][max(x[i],j)],dp[i−1][0][j]+p[i]−k)(j≤k<L[i])
总时间复杂度O(n3)。
T10 好的序列
rqy咕咕了QWQ
其他疑问可加以下交流群(加入一个即可啦~)
牛客多校算法训练营1:453799454
牛客全国算法训练营2:330766563
牛客多校算法训练营3:934889305