#P3221. [HNOI2012] 双十字

    ID: 2275 Type: RemoteJudge 1000ms 125MiB Tried: 0 Accepted: 0 Difficulty: 6 Uploaded By: Tags>动态规划,dp2012湖南状态压缩割点

[HNOI2012] 双十字

题目描述

在 C 部落,双十字是非常重要的一个部落标志。所谓双十字,如下面两个例子,由两条水平的和一条竖直的 1 线段组成:

..........
....1.....      ..1..
..11111...      .111.
....1.....      ..1..
.1111111..      11111
....1.....      ..1..
....1.....
..........

合法的双十字要求满足以下几个限制:

  • 两条水平的线段不能在相邻的两行。
  • 竖直线段上端必须严格高于两条水平线段,下端必须严格低于两条水平线段。
  • 竖直线段必须将两条水平线段严格划分成相等的两半。
  • 上方的水平线段必须严格短于下方的水平线段。

所以上面右边的例子是满足要求的最小的双十字。

现在给定一个 R×CR\times C01 矩阵,要求计算出这个 01 矩阵中有多少个双十字。例如下面这个例子,01 矩阵如下:

10001011
10111111
10001101
11111110
11111111
11101011

我们可以找到 55 个满足条件的双十字,分别如下:

....1...  ....1...  ....1...
...111..  ...111..  ...111..
....1...  ....1...  ....1...
..11111.  ..11111.  ....1...
....1...  ....1...  ..11111.
........  ....1...  ....1...

....1...  ....1...
...111..  ..11111.
....1...  ....1...
....1...  ....1...
.1111111  .1111111
....1...  ....1...

注意最终的结果可能很大,只要求输出双十字的个数 mod 109+9\bmod\ 10^9+9 的值。

输入格式

第一行为用空格隔开的两个正整数 RRCC,分别表示 01 矩阵的行数和列数。

第二行是一个非负整数 NN,表示 01 矩阵中 0 的个数。

接下来的 NN 行,每行为用空格隔开的两个正整数 xxyy1xR,1yC1\le x\le R,1\le y\le C),表示 (x,y)(x,y)0。数据保证 NN0 的坐标两两不同。

输出格式

一行一个整数,为双十字的个数 mod 109+9\bmod\ 10^9+9 的值。

6  8
12
1  2
1  3
1  4
1  6
2  2
3  2
3  3
3  4
3  7
6  4
6  6
4  8
5

提示

对于 100%100\% 的数据,保证 5R,C1045\le R,C\le 10^40N1040\le N\le 10^4RC2×106RC\le 2\times 10^6