35+45+0
比较低迷了啊,归根到底还是没怎么认真。
第一题想得太快了,想到了正解但是没想好细节,打错了之后换暴力,还没有拿完部分分,血亏。
第二题思想方向错了。
第三题题意读错,调不出来。
这个状态很糟糕。
T1:
给出n个正整数,每个数可以选或不选,对于所有可重的有序三元组(x,y,z),如果x、y、z都被选了,那么可以产生(1/x+1/y+1/z)*(x^2+y^2+z^2)的贡献,否则会产生(3*x+3*y+3*z)的贡献。求最大贡献以及最大贡献下选择的最小数的数量。
n<=1e7
题解:
首先,贡献最大的情况就是全选。用基本不等式弄一下即可。
当然如果全部数相同,那么全部不选贡献也是一样大的。
仅考虑选的情况,拆开式子可以发现答案与数的和、平方和、倒数和有关,分别维护就行了。
复杂度O(n)
T2:
给出两个分数x、y初始都是0,每天可以选择x+1或者y+1,有n种奖励,每个奖励形如(xi,yi,zi)表示如果某天你的x分数大于等于xi,y分数大于等于yi,那么你在那天可以获得zi的分数。一共有m天。求最大分数。
n<=2000,m,xi,yi<=1e9,zi<=10000
题解:
可以想到m^2dp,设f[i][j]表示x=i,y=j时的最大分数,根据意义转移即可。
当然可以n^2预处理出x=i,y=j时的每天增加的分数。
观察可以发现,上述dp的转移很多时候一大段时间都是相同转移,很冗余。
有用的x和y的值分别最多只有n个,所以离散化一下,做上述dp就好了。
复杂度O(n^2)
T3:
给出一棵n个节点的树,每个点上有一个权值,以1为根。
可以有删除操作,就是指当节点x的所有儿子都为叶子节点的时候,可以把所有儿子删除。
将最终树的dfs序求出来,价值为所有叶子的权值和减去dfs序上相邻两个叶子的路径(不包括两个叶子)上的最大点权。
求最大价值。
n<=2e5
题解:
发现删除操作的意义就是:每个叶子到根节点的路径上只能有1个点成为最终树的叶子。
也就是说树上的点x要作为叶子,设在原dfs序上x的前方上一个叶子为y,能够成为新树上x的前一个叶子的,只能是y—>lca(x,y)(不包括lca(x,y))上的点。
我们可以设一个dp,f[x]表示,以x这个节点作为新树dfs序上的最后一个点的价值。
转移就是从可能的上一个叶子上转移。
直接暴力是n^2的,我们发现转移区域是一条链。
我们把这条链弄出来,发现转移的不同仅仅与两点路径上的最大值有关。
那么链上的区域可以分为两段,一段是以lca(x,y)—>x上的点作为最大值的,一段是以y—>lca(x,y)上的点作为最大值的。
发现这个其实可以用一个后缀最大值表示,再加一个指针扫一下就行了。
复杂度变成了O(n)