Zhy's Blog~

View My GitHub Profile

Archive
Categories
About

Codeforces Good Bye 2015

  2015最后一场CF,Div.1,Div.2混战,题目个人感觉不太对胃口,偏难了吧。
  拿大号(Des_Payfor)怒跪一场,不过还好不太遗憾,D题虽然没交上,但最终还是TLE的,是在下输了...
  根据这两年参加年终大战的经验→_→混战容易涨分...   

for (int i = 1;i <= N;i++)  
	for (int j = 1;j <= M;j++)  
		if (g[i][j] == '.' && g[i][j-1] == '.') tmp[i][j] = tmp[i][j-1]+1;  
		else tmp[i][j] = tmp[i][j-1];  

  然后有了tmp[i][j],就可以得到heng[i][j] = heng[i-1][j]+tmp[i][j]
  对于2 * 1的骨牌的处理类似,可得到一个shu[i][j]的前缀和矩阵,这些预处理的复杂度均为O(N^2)。
  此时考虑如果求矩阵[(a,b),(c,d)]内的1 * 2骨牌位置数,要注意矩阵的第一列不在考虑范围内,因为我们之前求出的heng[i][j]其实是说1 * 2的骨牌落脚点在(i,j),但在[(a,b),(c,d)]内,落脚点不可能是第一列[(a,b),(c,b)],可参考下图。对于2 * 1的情况的求解,则是不能考虑第一行。
  

  利用前缀和在O(1)时间内求出对区间[(a,b),(c,d)]的询问,先考虑1 * 2的骨牌,首先b++去掉第一列,然后由容斥原理——ans += heng[c][d]-heng[a-1][d]-heng[c][b-1]+heng[a-1][b-1];同理求2 * 1的情况,先a++去掉第一行,然后ans += shu[c][d]-shu[a-1][d]-shu[c][b-1]+shu[a-1][b-1],参考下图。

  
  code

© 个人原创,未经允许,不得转载!

Copyright © 2015-2016 zhyack. All Rights Reserved.

如对文章有任何疑问,请移步问题聚集区一览~