CF219 Div 1 题解

比赛还没结束呢……但是提前滚粗了,真是悲伤……幸好开的小号


A:原题题意挺简洁的,自己看吧。

这题纠结了我好久……直接从小到大或者从大到小贪心是错的,反例分别是2458和2348。事实上可以二分答案x,然后选最大的x个去套最小的x个。套不了答案就不可行。


B:有个n*m的矩阵,每个元素是0或者1。定义一个矩形合法当且仅当内部没有1。有q次询问,每次给定x1,y1,x2,y2,问左上角和右下角在这个范围内的矩形有多少是合法的。n,m<=40,q<=30w。

由于n*m才1600我们可以考虑直接求每种可能询问的答案。先预处理前缀和,并求出所有合法的矩形。令cnt[x1][y1][x2][y2]表示右下角为(x2,y2)且左上角不超过(x1,y1)的矩形数,实际上就是合法矩形的前缀和,容斥一下可以求出。令ans[x1][y1][x2][y2]表示答案,这货实际上就是cnt的某种前缀和,同样容斥一下可以求出。


C:有n个位置1~n和m场烟花,第i场的时间为ti,有两个系数ai和bi。在放第i场烟花的时候,如果人在位置x,那么收益为bi-abs(ai-x),收益可以为负。第1个时刻人可以在任意位置,之后每个时刻移动的距离不超过d。求最大收益。n<=15w,m<=300。

令f[i][j]表示第i场烟花时人在位置j,不难得出转移方程f[i][j]=max{f[-1][k]+bi-abs(ai-j)},其中abs(j-k)<=d*(ti-t_{i-1})。那么可行的转移是一个区间,而且还能用单调队列搞。复杂度O(nm),就能过了。


UPD:D题会做了!

D:有一棵n个点的树,要求选一个k个点的连通块,使得选出的连通块中点的编号的集合的权值最大。一个集合的权值定义为一个最长的区间[l,r],使得l,l+1,...,r-1,r都在集合中。1<=k<=n<=10w。

先二分答案x,然后可以枚举所有长度为x的区间。问题就在于判断这个区间内所有的点可不可以被不超过k-1条边连通。我们需要一个方法来支持:加一个点、删一个点,以及求使得连通的最少边数。

而转化得到的那个问题实际上就是CF176E。有一个比较神的做法:

先求出树的DFS序。假设要解决一个静态的问题,即给定k个点,求使得这k个点连通需要的边数。我们把这些点按照在DFS序中出现的位置排序,设它们为v1,v2,...,vk,那么答案实际上就是v1->v2+v2->v3+...+vk->v1的路径长度之和除以2。证明比较显然。我们只需要维护倍增就可以求出答案。那么对于动态问题,只需要用类似动态凸包的写法维护一个set,插入和删除时处理一下改变的那一小部分就好了。

于是整个问题就在O(nlog^2n)的时间内解决了。


E就不会了……坐等题解。

你可能感兴趣的:(OI)