NOIP提高組 矩陣

2021-07-23 00:06:21 字數 1490 閱讀 5981

在麥克雷的面前出現了乙個有n*m個格仔的矩陣,每個格仔用「.」或「#」表示,「.」表示這個格仔可以放東西,「#」則表示這個格仔不能放東西。現在他拿著一條1×2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。

因為棍子是1×2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影響的,否則兩塊是互不干擾的,那麼用矩陣字首和就能隨便解決,只需要再減去邊緣跨塊的方案數就可以啦!

var

c:array[0..501,0..501] of char;

f,h,l:array[0..501,0..501] of int64;

n,m,i,j,q,x1,x2,y1,y2:longint;

ans:int64;

begin

readln(n,m);

for i:=0

to n do c[i,0]:='#';

for j:=0

to m do c[0,m]:='#';

for i:=0

to n do c[i,m+1]:='#';

for j:=0

to m do c[n+1,m]:='#';

for i:=1

to n do

begin

for j:=1

to m do

begin

read(c[i,j]);

h[i,j]:=h[i,j-1];l[i,j]:=l[i-1,j];

if c[i,j]='#'

then

continue;

if c[i-1,j]='.'

then inc(h[i,j]);

if c[i,j-1]='.'

then inc(l[i,j]);

end;

readln;

end;

for i:=1

to n do

for j:=1

to m do

begin

f[i,j]:=f[i-1,j]+f[i,j-1]-f[i-1,j-1];

if c[i,j]='#'

then

continue;

if c[i-1,j]='.'

then inc(f[i,j]);

if c[i,j-1]='.'

then inc(f[i,j]);

end;

readln(q);

for i:=1

to q do

begin

readln(x1,y1,x2,y2);

ans:=f[x2,y2]-f[x2,y1-1]-f[x1-1,y2]+f[x1-1,y1-1];

ans:=ans-h[x1,y2]+h[x1,y1-1];

ans:=ans-l[x2,y1]+l[x1-1,y1];

writeln(ans);

end;

end.

NOIP2016提高A組模擬9 21 矩陣

看題目戳這裡 看不了的話就看下面吧不過少了乙個圖而且sample input很奇怪qaq description 在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少...

NOIP2007提高組 矩陣取數遊戲

本題dp 高精度即可。首先我們可以發現它的貢獻只與行有關係,於是就分成n行,每行都做dp,然後將max加起來即可。ps 用高精度實現 上標 include include include define mo 100000 define ll long long using namespace std...

提高組NOIP2007 矩陣取數遊戲

題目描述 帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的n m的矩陣,矩陣中的每個元素a i,j 均為非負整數。遊戲規則如下 每次取數時須從每行各取走乙個元素,共n個。m次後取完矩陣所有元素 每次取走的各個元素只能是該元素所在行的行首或行尾 每次取數都有乙個得分值,為每行取數的得分之和,每行取數的...