10.21 做题记录

概况

完成 cf 难度总和: ≈ 30000 ≈30000 30000

然而 wyq 今天做疯了竟然做了 ≈ 40000 ≈40000 40000

简要题解

CF865D

一道贪心题,最原始的想法就是建一个小根堆每次比较 a i a_i ai 与堆顶 x x x 如果 x < a i x<a_i x<ai 那么贡献即为 a i − x a_i-x aix 。但是这样是不对的,要考虑如何实现后悔,比如对于 [ 1 , 3 , 100 ] [1,3,100] [1,3,100] 显然买进 1 1 1 卖出 100 100 100 是最划算的。那么做到 3 3 3 的时候如何处理,我们把 3 3 3 加入小根堆两次那么到 100 100 100 时贡献即为 ( 3 − 1 ) + ( 100 − 3 ) (3-1)+(100-3) (31)+(1003) 这样就实现了后悔操作。

priority_queue<int,vector<int>,greater<int> > q;
For(i,1,n) 
{
    
    
	if(!q.empty())
	{
    
    
		if(a[i]>q.top()) 
		{
    
    
			ans+=a[i]-q.top();
			q.pop();
			q.push(a[i]);
		}
	}
	q.push(a[i]);
}

CF938B

可以看出这个过程和杨辉三角很相似,于是设 f i , j f_{i,j} fi,j 表示做到第 i i i 层的第 j j j 的元素是什么, f i , j = f i − 1 , j − 1 ⊕ f i , j − 1 f_{i,j}=f_{i-1,j-1}\oplus f_{i,j-1} fi,j=fi1,j1fi,j1。然后设 g i , j g_{i,j} gi,j 表示起点终点为 j j j 长度为 i i i 的最大 xor 值。那么 g i , j = max ⁡ ( max ⁡ ( g i − 1 , j − 1 , g i , j − 1 ) , f i , j ) g_{i,j}=\max(\max(g_{i-1,j-1},g_{i,j-1}),f_{i,j}) gi,j=max(max(gi1,j1,gi,j1),fi,j)

CF9D

f i , j f_{i,j} fi,j 表示到第 i i i 个点深度小于等于 j j j 的方案数,我们每次考虑枚举左儿子的 s i z = k siz=k siz=k,那么 f i , j = f k , j − 1 × f i − k − 1 , j − 1 f_{i,j}=f_{k,j-1}\times f_{i-k-1,j-1} fi,j=fk,j1×fik1,j1 最后答案为 f n , n − f n , h − 1 f_{n,n}-f_{n,h-1} fn,nfn,h1

CF464D

期望dp。首先先考虑 O ( n 2 ) O(n^2) O(n2) 的。设 f i , j f_{i,j} fi,j 表示打败第 i i i 个怪物其中某个武器的等级为 j j j 的期望得分。由于每只怪物的实质是一样的所以可以最后乘上去贡献。由于一般期望要倒推所以最后答案即为 m × f n , 1 m\times f_{n,1} m×fn,1。关于转移我们考虑三个情况:

1 当前选择得分为 t + 1 t+1 t+1 那么 f i , j = f i − 1 , j + 1 + j ( j + 1 ) × m f_{i,j}=\frac{f_{i-1,j+1}+j}{(j+1)\times m} fi,j=(j+1)×mfi1,j+1+j

2 当前选择得分为 [ 1 , t ] [1,t] [1,t] 那么 f i , j = ( f i − 1 , j + j + 1 2 ) × j ( j + 1 ) × m f_{i,j}=\frac{(f_{i-1,j}+\frac{j+1}{2})\times j}{(j+1)\times m} fi,j=(j+1)×m(fi1,j+2j+1)×j

3 得到的不是当前类型的武器那么 f i , j = f i − 1 , j × m m + 1 f_{i,j}=\frac{f_{i-1,j}\times m}{m+1} fi,j=m+1fi1,j×m

然后通过看题解发现某武器的等级 j j j 只需要枚举到 500 500 500 左右因为这以后对答案的贡献极小在误差范围内,于是就能过。

CF21D

这道题目主要难在思路的转换。考虑一条欧拉回路的特点在于每个点的度数都为偶数。那么我们考虑把那些奇数的点连边(边权即为 ( i , j ) (i,j) (i,j) 的最短路 floyed求一下就好了)。最后状压 dp 一下就好了。

CF85E

我们很容易想到二分答案。关键在于如何判定。我们每次对于一组 ( i , j ) (i,j) (i,j) 如果 D ( i , j ) > M i d D(i,j)>Mid D(i,j)>Mid 那么我们把其连边。于是如果是合法的 M i d Mid Mid 那么连成的图为二分图直接二分图染色一下判是否可行就好了。方案数即为 2 s 2^{s} 2s 其中 s 为连通块的个数。

猜你喜欢

转载自blog.csdn.net/wangyiyang2/article/details/109211750