考试遇到的问题:
很没有状态的一场考试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值拼接相当于从左到右的方向
另一种方向也要考虑了