Codeforces Round #589 (Div. 2) B——B. Filling the Grid

Suppose there is a h×wh×w grid consisting of empty or full cells. Let‘s make some definitions:

  • riri is the number of consecutive full cells connected to the left side in the ii-th row (1≤i≤h1≤i≤h). In particular, ri=0ri=0 if the leftmost cell of the ii-th row is empty.
  • cjcj is the number of consecutive full cells connected to the top end in the jj-th column (1≤j≤w1≤j≤w). In particular, cj=0cj=0 if the topmost cell of the jj-th column is empty.

In other words, the ii-th row starts exactly with riri full cells. Similarly, the jj-th column starts exactly with cjcj full cells.

These are the rr and cc values of some 3×43×4 grid. Black cells are full and white cells are empty.

You have values of rr and cc. Initially, all cells are empty. Find the number of ways to fill grid cells to satisfy values of rr and cc. Since the answer can be very large, find the answer modulo 1000000007(109+7)1000000007(109+7). In other words, find the remainder after division of the answer by 1000000007(109+7)1000000007(109+7).

Input

The first line contains two integers hh and ww (1≤h,w≤1031≤h,w≤103) — the height and width of the grid.

The second line contains hh integers r1,r2,…,rhr1,r2,…,rh (0≤ri≤w0≤ri≤w) — the values of rr.

The third line contains ww integers c1,c2,…,cwc1,c2,…,cw (0≤cj≤h0≤cj≤h) — the values of cc.

Output

Print the answer modulo 1000000007(109+7)1000000007(109+7).

Examples

input

Copy

3 4
0 3 1
0 2 3 0

output

Copy

2

input

Copy

1 1
0
1

output

Copy

0

input

Copy

19 16
16 16 16 16 15 15 0 5 0 4 9 9 1 4 4 0 8 16 12
6 12 19 15 8 6 19 19 14 6 9 16 10 11 15 4

output

Copy

797922655

Note

In the first example, this is the other possible case.

In the second example, it‘s impossible to make a grid to satisfy such rr, cc values.

In the third example, make sure to print answer modulo (109+7)(109+7).

大致题意就是给一个h × w的矩形,每一单位长宽有一个参数,参数表示这一单位的h(w)所对应的小矩形前r【i】(c【i】)有多少个边长为1的小正方形是涂黑的,问有多少种涂法。

刚看完题有点懵,不知道什么意思(英语渣),画了个图结合一下样例和提示大概明白了,当时的理解就是前r【i】+1和前c【i】+1是固定的,所以把每个点位遍历一遍,如果横纵坐标i,j都是大于r【i】, c【i】的,那么就*2,三十行代码敲完,测样例,高潮来了,我测了第一组样例过了,然后往下翻,我也不知道哪根神经出了问题,直接测到第三组样例去了,第三组样例也过了,然后就直接提交,wrong answer on test 2。 我当时 ?????????因为我当时测了两组数据都过了,我就以为前两个样例肯定是能过的,结果样例2wa了,赶紧回去看了一下样例,才发现漏了一组数据。再测这组, 1, 1, 0, 1.输出0,可能是最近有点膨胀的原因,也没仔细看样例,下意识直接认为是没有点可以摇摆的时候输出0,就在输出的时候加了一个判断if(ans==1)输出0,wrong answer on test 4,我?????先入为主的我还没有意识到问题的严重性,想了二十分钟以后毫无进展的我骂了一句垃圾题目之后去写C题了……………………………………很脑残对吧,我现在想想也觉得很脑残,这是人能做出来的事吗?没有点可以摇摆的时候最差不也是输出1吗?这段时间写的题目基本会加一句保证数据合理或者答案存在,导致这道题即使没加这一句我也下意识当做是这样的数据了,然而其实样例就已经说明了一切,我还是李青附体的跳过了出题人对我的照顾,众所周知,电子竞技不需要视力,唉唉唉唉唉唉唉,掉了102分啊!!!

赛后看了一下学长们的代码,感觉都有点繁琐,看了两眼就没看了,在和学长下棋的时候知道了原来还有不存在的情况,当场心态没了,第七滚粗之后准备第二天再来补题。

到工作室之后十分钟就写完了,还是只有三十行,有点难受,来日方长吧。

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 using namespace std;
 4 LL r[1005], c[1005];
 5 int main()
 6 {
 7     LL h, w;
 8     LL ans = 1, flag = 0;
 9     scanf("%lld%lld", &h, &w);
10     for(int i = 1;i <= h;i++)
11         scanf("%lld", &r[i]);
12     for(int i = 1;i <= w;i++)
13         scanf("%lld", &c[i]);
14     for(int i = 1;i <= h;i++)
15     {
16         for(int j = 1;j <= w;j++)
17         {
18             if((i > (c[j] + 1)) && (j > (r[i] + 1)))
19                 ans = ans*2%1000000007;
20             else if((i <= (c[j])) && (j == (r[i] + 1)))
21                 flag = 1;
22             else if((i == (c[j] + 1)) && (j <= (r[i])))
23                 flag = 1;
24         }
25     }
26     if(flag)
27         printf("0\n");
28     else
29         printf("%lld\n", ans);
30     return 0;
31 }

今天中午和大黄吃完饭回寝的路上碰到了黄波学长,不知道怎么就想到了刚入竞赛队的时候,算了算居然也才打了半年的ACM,但为啥感觉已经过了很久很久了啊………

加入竞赛队到现在,一步一步走过来,自闭了快半年,从最开始写几道水题都要想半天还经常错,到后来在hdu和codeforces上刷水题,学习bfs,dfs,最短路这些算法,stl容器,dp思想,从绞尽脑汁写出一道div2的B题到现在半小时内还没写出B都会骂自己蠢,从什么都不会的小白到现在代码量也有上万的小弱鸡,虽然还是菜吧,但还算是收获了很多东西的吧。

以前的我从来不懂努力的真正意义到底是什么,很多时候都是为了别人在努力,为父母,为朋友,甚至是为了不相识的人,但是最近我好像明白了一点,也许努力从来都不是为了什么,而是当你见过的足够多的时候,就会明白不努力是会失去一些东西的,所以选择努力,很多时候是为了让未来的自己有更多可以选择的东西,而不是只能被动失去。其实大部分人也都知道,但是没有方向,不知道如何开始,没有动力,缺少坚持下去的毅力。一边取悦当下的自己,一边害怕未来的自己失望,也许这就是焦虑的源泉吧。

据说能看到这的都是大帅比!

原文地址:https://www.cnblogs.com/Mamba0Z/p/11613647.html

时间: 2024-11-04 10:57:19

Codeforces Round #589 (Div. 2) B——B. Filling the Grid的相关文章

Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理

Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理 [Problem Description] 在\(n\times n\)的格子中填入\([1,k]\)之间的数字,并且保证每一行至少有一个\(1\),每一列至少有一个\(1\),问有多少种满足条件的填充方案. [Solution] 令\(R[i]\)表示为第\(i\)行至少有一个\(1\)的方案数,\(C[i]\)表示第\(i\)列至少有一个\(1\)的方案数.则题目要

Codeforces Round #589 (Div. 2) (e、f没写)

https://codeforces.com/contest/1228/problem/A A. Distinct Digits 超级简单嘻嘻,给你一个l和r然后寻找一个数,这个数要满足的条件是它的每一位的数字不相同,找出满足要求的最小的那个数输出,没有找到就输出-1: 1 #include<bits/stdc++.h> 2 using namespace std; 3 bool check(int n){ 4 int vis[15]={0}; 5 while(n){ 6 if(!vis[n%

Codeforces Round #589 (Div. 2)

目录 Contest Info Solutions A. Distinct Digits B. Filling the Grid C. Primes and Multiplication D. Complete Tripartite E. Another Filling the Grid Contest Info Practice Link Solved A B C D E F 5/6 O O O O ? - O 在比赛中通过 ? 赛后通过 ! 尝试了但是失败了 - 没有尝试 Solutions

Codeforces Round #589 (Div. 2) Another Filling the Grid (dp)

题意:问有多少种组合方法让每一行每一列最小值都是1 思路:我们可以以行为转移的状态 附加一维限制还有多少列最小值大于1 这样我们就可以不重不漏的按照状态转移 但是复杂度确实不大行(减了两个常数卡过去的...) #include <bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const double eps = 1e-6; const int N = 3e5+7; typedef long long ll; co

Codeforces Round 589 (Div. 2) 题解

Is that a kind of fetishism? No, he is objectively a god. 见识了一把 Mcdic 究竟出题有多神. (虽然感觉还是吹过头了) 开了场 Virtual 玩. 开场先秒了 AB.C 居然差点没做出来,有点耻辱. 开 D.怎么不会--Div. 2 的 D 都能卡住我,我心态崩了. 调到 E. woc 这不是 sb 题吗-- 回来肝 D.想了想口胡出来了,然而心态已经崩了,用了很长很长时间才打出来. 最后只剩 20min 时开 F.这--辣鸡三合

Codeforces Round #589 (Div. 2) A. Distinct Digits

链接: https://codeforces.com/contest/1228/problem/A 题意: You have two integers l and r. Find an integer x which satisfies the conditions below: l≤x≤r. All digits of x are different. If there are multiple answers, print any of them. 思路: 水题. 代码: #include

Codeforces Round #589 (Div. 2) - A

题目大意:给定一个闭区间,问这个区间内有没有满足各数位数字不相等的数,有的话输出任意一个,没有的话输出 -1. #include <bits/stdc++.h> #include <bitset> using namespace std; #define mp(x, y) make_pair(x,y) #define mset(a, n) memset(a, n, sizeof(a)) #define forn(i, n) for (int i = 0; i < (n); i

Codeforces Round #589 (Div. 2) - C

题目大意:$prime(x)$ 代表 $x$ 的质因数的集合. $g(x, p)$ 代表 $p^k$ 的最大值, $k$ 为整数,并且 $x$ 可以被 $p^k$ 整除. $f(x, p)$ 代表 对于 $prime(x)$ 中的每一个 $x$ 的 $g(x, p)$ 值. 现在给定 $x, n$ 求 $f(x, 1) * f(x, 2) * ... *f(x, n) mod (10^9 + 7)$ 的值. 思路:对于 $x$ 进行质因数分解,分别考虑每一个 $prime(x)$ 对答案做出的贡

Codeforces Round #589 (Div. 2) - B

题目大意:给定一个 $h$ 行, $w$ 列的矩形,接下来一行 $h$ 个数字, $hi$ 代表第 $i$ 行从左到右有连续的 $hi$ 个染成黑色的方块,列同理,然后问满足条件的矩形的个数(% 1e9 + 7). 比赛写的时候第一次挂掉了,因为判断原条件不成立的代码写挂了= = ,不知道自己当时在想什么. 我在处理数据时,开了两个数组,分别记录行与列的染色情况. forab(i, 1, h) { cin >> r[i]; forab(k, 1, r[i]) G[i][k] = 1, R[i]