Codeforces 611C New Year and Domino(二维前缀和)
2016-07-24 10:00
483 查看
题目大概说给一个n*m个格子,格子'.'表示可以放东西,多次询问矩形区域(x1,y1)-(x2,y2)有几种放一张1*2的骨牌的方案数。
分别考虑横着竖着放,预处理出二维的前缀和,即sum[x][y]表示(1,1)-(x,y)的横着或者竖着放的方案数,然后对于每一个询问就拆成几个前缀和容斥一下。。
细节要注意。。骨牌是1*2的。。
分别考虑横着竖着放,预处理出二维的前缀和,即sum[x][y]表示(1,1)-(x,y)的横着或者竖着放的方案数,然后对于每一个询问就拆成几个前缀和容斥一下。。
细节要注意。。骨牌是1*2的。。
#include<cstdio> #include<cstring> using namespace std; char map[555][555]; int hsum[555][555],vsum[555][555]; int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1; i<=n; ++i){ for(int j=1; j<=m; ++j){ scanf(" %c",&map[i][j]); } } for(int i=1; i<=n; ++i){ for(int j=2; j<=m; ++j){ int t=(map[i][j]=='.' && map[i][j-1]=='.'); if(i==0){ hsum[i][j]=hsum[i][j-1]+t; }else{ hsum[i][j]=hsum[i][j-1]+hsum[i-1][j]-hsum[i-1][j-1]+t; } } } for(int i=2; i<=n; ++i){ for(int j=1; j<=m; ++j){ int t=(map[i][j]=='.' && map[i-1][j]=='.'); if(j==0){ vsum[i][j]=vsum[i-1][j]+t; }else{ vsum[i][j]=vsum[i][j-1]+vsum[i-1][j]-vsum[i-1][j-1]+t; } } } int q,x1,y1,x2,y2; scanf("%d",&q); while(q--){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); int res=hsum[x2][y2]-hsum[x2][y1]-hsum[x1-1][y2]+hsum[x1-1][y1]; res+=vsum[x2][y2]-vsum[x2][y1-1]-vsum[x1][y2]+vsum[x1][y1-1]; printf("%d\n",res); } return 0; }
相关文章推荐
- u-boot.lds 链接脚本分析(hi3515)
- 各个浏览器的内核
- Mesos源码分析(3): Mesos Master的启动之二
- [LEETCODE]52. N-Queens II
- 解决linux系统WIFI无法使用5GHz频率的问题
- 由CP函数认识文件的基本操作
- 【Java】面向对象(二)继承
- Excel Sheet Column Number
- 每天一篇linux教程-----Linux 文件基本属性
- lower_bound()
- 非结构化网格内等值线绘制
- Aaronson hdu5747 解题报告 深剖水题
- JavaScript提高网站性能优化的建议(二)
- C# 枚举尚未开始,或者已经结束
- HDU 5656 CA Loves GCD
- MVC初接触
- 剑指offer 38题 【知识迁移能力】数字在排序数组中出现的次数
- LAMP+Zabbix课程总结
- python运维服务器
- linux分区知识