跳过正文
  1. Posts/

cf 611 A||codeforces goodbye 2015 C. New Year and Domino

·1 分钟

http://codeforces.com/contest/611/problem/C 题意:给出一个n*m的地图,.表示可以空,#表示墙。一个东西需要占两个相邻的格子,问给定一个矩形,放一个东西的方案数。 思路:q很大。。应该是先预处理出来直接调用答案。。。计数问题累加性。。应该是前缀和之类。。需要做的就是怎么标记。。我的做法是竖着放和横着放的个数分开来存。从左往右从上往下,每次标记到后一个点。然后二维的前缀和。然后每次询问的时候,去掉最上边和最左边两条边界上对应的多加的点。

 1#include <cstdio>
 2#include <cstring>
 3#include <iostream>
 4#include <algorithm>
 5#include <vector>
 6#include <queue>
 7#include <set>
 8#include <map>
 9#include <string>
10
11using namespace std;
12
13const int N=5E2+7;
14char maze[N][N];
15int n,m;
16int q;
17int a[N][N],b[N][N];
18int sum[N][N];
19int sum2[N][N];
20
21int main()
22{
23	cin>>n>>m;
24	memset(a,0,sizeof(a));
25	memset(b,0,sizeof(b));
26	for ( int i = 0  ; i< n ;i++ ) scanf("%s",maze[i]);
27	for ( int i = 1 ;  i < n ; i++)
28	{
29	    for (int  j =  0 ; j< m ;j++)
30	    {
31		if (maze[i][j]=='.'&&maze[i-1][j]=='.')
32		    a[i+1][j+1]++;
33	    }
34	}
35
36	for ( int i = 0 ; i < n ; i++)
37	{
38	    for ( int j = 1 ;  j < m ; j++)
39	    {
40		if (maze[i][j]=='.'&&maze[i][j-1]=='.')
41		    b[i+1][j+1]++;
42	    }
43	}
44	sum[0][0] = 0;
45	sum2[0][0] =  0;
46	for ( int i = 1 ; i <= n ; i++)
47	{
48	    for ( int j = 1 ;  j<= m ; j++)
49	    {
50		sum[i][j] =sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
51		sum2[i][j] = sum2[i-1][j]+sum2[i][j-1]-sum2[i-1][j-1] + b[i][j];
52	    }
53	}
54	cin>>q;
55
56	while (q--)
57	{
58	    int n1,n2,m1,m2;
59	    scanf("%d %d %d %d",&n1,&m1,&n2,&m2);
60	    int ans = 0 ;
61	    ans+=sum[n2][m2]-sum[n1-1][m2]-sum[n2][m1-1]+sum[n1-1][m1-1];
62	    ans+=sum2[n2][m2]-sum2[n1-1][m2]-sum2[n2][m1-1]+sum2[n1-1][m1-1];
63	    for ( int j = m1 ; j <= m2 ;j++)
64	    {
65		if (a[n1][j]==1) ans--;
66	    }
67	    for ( int i = n1 ; i <= n2 ; i++)
68	    {
69		if (b[i][m1]==1) ans--;
70	    }
71
72	    printf("%d\n",ans);
73	}
74
75    return 0;
76}

相关文章

codeforces 31 C. Schedule

·2 分钟
http://codeforces.com/problemset/problem/31/C 题意:给出n个借用教室的时间安排,可能会有冲突。要求恰好去掉一个时间安排使得剩下的时间安排不冲突。问多多少种方案。 思路:首先一个直觉是。。除非初始就没有任何冲突。。不然这个答案不会很大。。

codeforces 18 C. Stripe

·1 分钟
http://codeforces.com/contest/18/problem/C 题意:将一个序列分成两个非空的部分,保证和相等,问有多少种方法。 思路:做过一个三部分的。。。两部分直接一个前缀和就好了把。。。有一个需要注意的是。。判断负数是否是奇数的时候需要加个绝对值。。。

codeforces #336 div 2 B. Hamming Distance Sum

·1 分钟
http://codeforces.com/contest/608/problem/B 题意:给定两个字符串a,b,问b中的每个连续的长度为a的子串与a的哈密顿距离的和是多少。哈密顿距离是对应位置的字符的差的绝对值的和。由于是01串,也就是字符不同的位置数。 思路:类似前缀和。0和1分别搞。注意开long long

codeforces 1 B. Spreadsheets

·2 分钟
http://codeforces.com/problemset/problem/1/B 题意:给出了两种表格的表示方法。要求互相转化。 思路:直接模拟即可。注意和一般的进制转化不同的是,26进制对应的是1到26而不是0到25,所以要记得处理下借位。

codeforces 158 B. Taxi

·1 分钟
http://codeforces.com/problemset/problem/158/B 题意:n组人,每组有si个(1<=si<=4),每辆车能装4个人。问最少需要多少辆车装下所有人并且保证同一组的人在一辆车里。 思路:统计人数分别为1,2,3,4的人数。对于4的直接加到答案。贪心的思路是:优先用人数少的去填人数多的。