B - Christmas Trees
在x轴上种树,种树的坐标为A+kMA+kMA+kM
求L,RL,RL,R之间(闭区间)有几棵树
首先将LRLRLR平移A,这样种树坐标为kMkMkM
然后求LLL能包含的kkk和RRR能包含的kkk
最后求出区间树的数量,注意两边都是闭区间。C++64位会越界,用python写就好了。
C - Socks 2
有NNN对袜子,每种袜子都是一种颜色Ci=iC_i=iCi=i
现在有一些颜色A1,A2,...AkA_1,A_2,...A_kA1,A2,...Ak少了一只,需要将其重新配对,若只剩奇数只袜子则扔掉一只。
配对后每对袜子的分数是∣Ci−Cj∣|C_i-C_j|∣Ci−Cj∣
最小化总分之和。
首先是贪心配对,如单独的袜子是偶数,那么按小到大两两组合。
如例子[1,3][1,3][1,3]中
如果是[1,2],[2,3][1,2],[2,3][1,2],[2,3],答案总分和[1,3],[2,2][1,3],[2,2][1,3],[2,2]是一样的。
我们在单独的袜子中观察,因为相邻的两项如果中间有成对袜子
记ai<b<aja_i<b<a_jai<b<aj,其中ai,aja_i,a_jai,aj是单独袜子,而bbb是成对袜子
那么(b−ai)+(aj−b)=(aj−ai)+(b−b)(b-a_i)+(a_j-b)=(a_j-a_i)+(b-b)(b−ai)+(aj−b)=(aj−ai)+(b−b)
也就是分数和成对袜子无关,只需要将单独袜子排序。当单独袜子是偶数时,直接两两组合。
如单独的袜子是奇数,那么需要遍历每一只可能丢弃的袜子
[1,3,5,6,7][1,3,5,6,7][1,3,5,6,7]
首先3−1+6−53-1+6-53−1+6−5
然后3−1+7−5=(3−1+6−5)−6+73-1+7-5=(3-1+6-5)-6+73−1+7−5=(3−1+6−5)−6+7
然后3−1+7−6=(3−1+7−5)+6−53-1+7-6=(3-1+7-5)+6-53−1+7−6=(3−1+7−5)+6−5
然后5−1+7−6=(3−1+7−6)−3+55-1+7-6=(3-1+7-6)-3+55−1+7−6=(3−1+7−6)−3+5
…交错进行更新。
D - Reindeer and Sleigh
有NNN只雪橇,每只雪橇都是由AiA_iAi只驯鹿拉动。
现在给出XXX只鹿,问最多能拉几只雪橇。
裸考lower_bound的使用方法。
E - Christmas Color Grid 1
N∗NN*NN∗N的方格里面,每个格子为红或者绿。
随机抽一个红色的格子将其转换为绿格子,问转换后绿色的连通格个数的期望值。
首先dfs一遍绿色的连通格子数原来有几个cntcntcnt,并对不同连通块标上号。
然后对于每个红格子,求其周围有几个不同的连通块szszsz,答案就是cnt−(sz−1)cnt-(sz-1)cnt−(sz−1)
F - Christmas Present 2
圣诞老人要给平面坐标上的NNN个小朋友发礼物
他从Sx,SySx,SySx,Sy点的家里出发,依次访问1....n1....n1....n号小朋友,最后需要回到家。
但是他一次只能携带KKK件礼物,因此送完KKK件礼物后需要回到家。
问圣诞老人最少的行程距离。
dp滑动窗口最值。
很明显的有1...n1...n1...n的状态划分,不要想去上一步维护礼物的数量,而是干脆用回到家作为一个状态结束的标志,然后维护kkk步。
设f(i)f(i)f(i)为访问完iii个小朋友后回到家的最短距离。从i−ki-ki−k切分状态。
f(i)=min{f(i−k)+di+di−k+1+path(i−k+1,i)}f(i)=\min \bigg \{ f(i-k)+d_i+d_{i-k+1} + path(i-k+1,i) \bigg \}f(i)=min{f(i−k)+di+di−k+1+path(i−k+1,i)}
其中path(i−k+1,i)path(i-k+1,i)path(i−k+1,i)代表从i−k+1i-k+1i−k+1点到iii点的路径距离,这个距离可以用前缀和求出来:
s[i]−s[i−k+1]s[i]-s[i-k+1]s[i]−s[i−k+1]
整理可得:
f(i)=min{f(i−k)+di+di−k+1+si−si−k+1}k<=Kf(i)=\min \bigg \{ f(i-k)+d_i+d_{i-k+1}+s_i-s_{i-k+1} \bigg \} \quad k<= Kf(i)=min{f(i−k)+di+di−k+1+si−si−k+1}k<=K
这里把iii相关的提出来,剩下的部分为:
f(i)=min{f(i−k)+di−k+1−si−k+1}+si+dik<=Kf(i)=\min \bigg \{ f(i-k)+d_{i-k+1}-s_{i-k+1} \bigg \} + s_i+d_i \quad k<= Kf(i)=min{f(i−k)+di−k+1−si−k+1}+si+dik<=K
剩下的那部分就交由最小堆来解决。
G - Christmas Color Grid 2
N∗NN*NN∗N的方格里面,每个格子为红或者绿。
随机抽一绿色的格子将其转换为红格子,问转换后绿色的联通格个数的期望值。
前面和E题类似。求连通图的个数。
然后建图。tarjan求对每个节点割完后的连通子图个数。