考试总结 模拟63

考试遇到的问题:

很没有状态的一场考试T1调了半天的nth_element,而且还没记得复杂度,

然后发现了nth_element(a+l,a+k,a+r),其中的k表示[l,r]中第k小元素且l!=1时k应该+l-1

后来又发现交上去的代码有如下若干问题:

1.线筛打错了,应该是if(v[i]<prm[j])break;

2.s1,s2数组开到了1e8。。。

3.交的代码没删调试

T2题干的问题?虽然好多人看出来没说取abs

T1坑

T2

一个显然的贪心,考场上比较犹豫的,每个人都去拿当前最大的,否则同样一次机会,会让对手拿到更大的

那么考虑怎么维护?$O(kn)$是可以的

那么每次就可以开个桶,然后每次记录最大值然后每次 while(!t[mx])--mx;   当然要离散化

T3

考场上想多了证明了一下是否是让旅行家的更少

旅行家每次扔食物的操作就会使其经过的点权加大,只会让后者更大

考虑dp

定义f[i][j]表示从i的子树某点走向i 撒下了j的面包渣的贡献

定义g[i][j]表示从i走向子树中某点撒了j面包渣的贡献

转移 f[x][j]=max{g[y][j-1]+sum[x]-a[y]}sum[x]为与x相连的所有点的点权和,多出来的贡献就是sum[x]-a[y]

g[x][j]=max(g[y][j-1]+sum[x]-a[fa])为什么要-a[fa]?考虑最终对ans做贡献:

ans=max(ans,f[x][j]+g[x][V-j])两者必须要减去一个拼接点x的fa

对于每个点dp正反跑两边:第一遍按照一个顺序更新出的x的dp值拼接相当于从左到右的方向

另一种方向也要考虑了

猜你喜欢

转载自www.cnblogs.com/casun547/p/11635766.html