CF219 Div 1 题解
2013-12-14 00:02
211 查看
比赛还没结束呢……但是提前滚粗了,真是悲伤……幸好开的小号
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就不会了……坐等题解。
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就不会了……坐等题解。
相关文章推荐
- cf 219 div 1
- CF 131 div2 B
- CF 61 div2 D. Petya and His Friends
- cf_369_div 2_E
- cf 80 div1 B(graph)
- CF 196 Div 2 D (树形dp)
- CF 134 DIV1 B.Blackboard Fibonacci
- CF 280B. Vanya and Lanterns(div2)
- Kolya and Tandem Repeat - CF#253 (Div. 2)B (443B) 哈希或水题
- CF Codeforces Round #256 (Div. 2) D (448D) Multiplication Table
- CF Codeforces Round #257 (Div. 1) A (449A) Jzzhu and Chocolate
- CF 242E(div 2) n课线段树更新
- CF div #151 E题
- CF DIV1 343A shuxue
- CF 294 div2 D. A and B and Interesting Substrings (hash)
- CF 297 div2 E. Anya and Cubes (hash+dfs)
- CF Codeforces Round #162 (Div. 1) A. Escape from Stones
- Codeforces Round #219 (Div. 2)A. Collecting Beats is Fun
- CF Round# 449 Div2 B. Chtholly's request
- CF 246 div2 D Prefixes and Suffixes (全部前缀的出现次数)