【BestCoder 1st Anniversary】
AB题都是签到题。。。。
C
题意:
有一串数列,An=3*n*(n-1)+1
然后要从A数列中选取尽量少个数(可重复),使得Sum(An)=m
题解:
贪心地想,能拿大就拿大很明显就是错的。。。【哪里明显了。。。【反正就是错的
然后3*n*(n-1)+1=6*n*(n-1)/2+1,而n*(n-1)/2是三角形数,任意一个自然数最多只需要3个三角形数即可表示
所以设m是由k个数组成的,m=Sum(3*n*(n-1)+1)=6*(k个三角形数之和)+k
所以我们分情况来看:假如k=1和2则直接求,k>=3时只要m-k mod 6==0就找到解
D
题意:
给一个二分图,求最多加几条边就能变成完全二分图。不允许有重边。
题解:
首先,完全二分图是指第一个点集中的所有顶点都与第二个点集中的所有顶点相连的二分图。自己跑去百度才知道的。。。
那么完全二分图的边数就为N*M,其中N和M是两点集的顶点数。我们要做的就是使N*M最大。N+M已知嘛那么N-M越小越好嘛……
首先,对于原图中的一个联通块,我们黑白染色,同色的只能分到同一个点集
然后,DP[i][g]表示前i个联通块能否选取得到大小为g的点集,N^2的转移。。。
N多大?10000。。。。
优化?还想不出咧。。
E
题意:
一棵树,N个点,每个点有个权值。假如一条路径经过的点的Max-Min<=D的话这条路径即为合法。求有多少条路径合法。
题解:
出题人的做法是点分治, 比赛的时候有人排序之后用lct维护单调性过了.
设分治中心为g, 我们只需要计算跨过g的答案, 其他的可以分治计算.
跨过根的可以容斥做, 没有限制的 - ∑端点落在同一颗子树上的. 上述两个过程是一样的, 于是只考虑没有限制的怎么做.
令xi,yi为i到g路径上的最大值和最小值. 我们按照xi排序, 然后枚举xi必选, 那么前面可选的xj,yj(j<i)必须要满足xi−d≤xj,xi−d≤yj, 由于xj≥yj, 只需要考虑xi−d≤yj. 于是只要枚举xi然后用树状数组统计答案即可. 复杂度是O(nlog2n).
事实上也是存在O(nlogn)的点分治做法, 分治时每次把树差不多分成两半, 就可以利用单调性, 用单调队列维护答案. 做法和POI2010 Pilots类似. 这个做法在比赛开始后Claris想到的.
F
太神了不会不会。。。。。
签到题没FST!!!