Sicily 1033. City Road

1033. City Road

Constraints

Time Limit: 1 secs, Memory Limit: 32 MB

Description

Long long ago, city Old was all around the water and was divided into M*N small square houses. The city Old had only two bridges, in the southwest corner and northeast corner. It’s obvious that the citizens can have C(m+n, n) different ways with shortest length, to go from one bridge to the other.

     As the city developed, bigger buildings came out and blocked some streets. These new buildings were always large rectangles combining many small houses. Since the new buildings may affect the number of shortest ways a lot, it’s you job now to recalculate the number.

     The city has M rows and N columns of houses, M+1 horizontal streets, and N+1 vertical streets. Suppose the house in the southwest corner is (1, 1), then the house in the northeast corner can be marked as (m, n). And then each new building can be described by its southwest corner(house) and its size(number of houses) in horizontal and vertical directions.

     The picture below shows that the city Old has 5*6 houses and one 3*2 building with its southwest corner located at (2,4). The number of different shortest ways in the picture is 192.

Input

This problem has multiple test cases. In each test case, the first line is two integer m, n(m*n<=1,000,000)which indicate the size of city Old, in vertical and horizontal directions respectively. And the second line has one integer B(B<=1000) what is the number of the new buildings. After that there are B lines. Each line has four integers x, y, a, b, describing the southwest corner (x, y) , the vertical size a, and the horizontal size b of the building. The buildings may be overlapped with each other. The input is terminated by a case with m*n=0, which should not be processed.

Output

For each test case output one integer representing the number of shortest ways in a single line. This number is guaranteed to be less than 2^63.

Sample Input

5 612 4 3 20 0

Sample Output

192

Problem Source

ZSUACM Team Member

// Problem#: 1033
// Submission#: 3402870
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <iomanip>
#include <algorithm>
#include <queue>
#include <functional>
#include <map>
#include <string.h>
#include <math.h>
using namespace std;

const int MAX = 1000010;

int N, M, B;

bool G[MAX];
long long dp[2][MAX];

int main() {

    //std::ios::sync_with_stdio(false);

    while (1) {

        scanf("%d%d", &M, &N);
        if (!M && !N) break;

        int size = N * M;

        for (int i = 1; i <= size; i++) G[i] = false;

        scanf("%d", &B);
        for (int i = 0; i < B; i++) {
            int x, y, a, b;
            scanf("%d%d%d%d", &x, &y, &a, &b);
            a = x + a - 1;
            b = y + b - 1;
            for (int j = x; j < a; j++) {
                for (int k = y; k < b; k++) {
                    G[(j - 1) * N + k] = true;
                }
            }
        }

        int lastLine = 0, nowLine = 1;

        for (int i = 1; i <= N; i++) {
            dp[0][i] = 1;
            dp[1][i] = 0;
        }

        for (int i = 1; i <= M; i++) {
            dp[nowLine][0] = 1;
            for (int j = 1; j <= N; j++) {
                if (G[(i - 1) * N + j])
                    dp[nowLine][j] = 0;
                else 
                    dp[nowLine][j] = dp[lastLine][j] + dp[nowLine][j - 1];
            }
            nowLine = 1 - nowLine;
            lastLine = 1 - lastLine;
        }

        printf("%lld\n", dp[lastLine][N]);

    }

    return 0;
}                                 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值