NOIP2016提高A組模擬9 21 矩陣

2021-07-23 00:06:21 字數 1902 閱讀 2008

看題目戳這裡~(看不了的話就看下面吧不過少了乙個圖而且sample input很奇怪qaq)

description

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

input

第一行包含 2 個正整數 n,m。

接下來 n 行每行包含 m 個字元「.」或「#」。

第n+1行包含1個正整數q,表示詢問次數。

接下來q行每行包含4個正整數r1,c1,r2,c2,分別表示詢問的子矩陣的左上格仔和右下格仔的位置。

output

輸出共 q 行,每行包含 1 個整數,表示該詢問的方案數。

sample input

5 8

….#..#

.#……

……..

4 1 1 2 3

4 1 4 1

1 2 4 5

2 5 5 8

sample output

4 0

10 15

data constraint

30%:q<=100

100%:q<=10^5,1<=n,m<=500

設sum[i,j]為第i行前j個位置如果要橫著擺有多少種情況

sum1[i,j]為第i行前j個位置如果要豎著擺有多少種情況(i在下面)

那麼每一次直接字首和統計答案就好了

var

f,g:array[0..505,0..505]of longint;

s:array[0..505,0..505]of char;

i,j,k,l,n,m,r1,c1,r2,c2,ans,q:longint;

begin

// assign(input,'t2.in'); reset(input);

// assign(output,'t2.out'); rewrite(output);

readln(n,m);

for i:=1

to n do

begin

for j:=1

to m do

read(s[i,j]);

readln;

end;

for i:=1

to n do

begin

for j:=2

to m do

begin

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

if (s[i,j]='.') and (s[i,j-1]='.') then inc(f[i,j]);

end;

end;

for i:=2

to n do

begin

for j:=1

to m do

begin

g[i,j]:=g[i,j-1];

if (s[i,j]='.') and (s[i-1,j]='.') then inc(g[i,j]);

end;

end;

readln(q);

for i:=1

to q do

begin

readln(r1,c1,r2,c2);

ans:=0;

for j:=r1 to r2 do

ans:=ans+f[j,c2]-f[j,c1];

for j:=r1+1

to r2 do

ans:=ans+g[j,c2]-g[j,c1-1];

writeln(ans);

end;

// close(input); close(output);

end.

NOIP2016提高組模擬 積木

比賽的時候用了個神奇的小暴力,本來打算拿40分,沒想到暴力出奇蹟,隨機資料下表現優良,居然碾過去了。暴力方法不講,只貼 僅供對拍。正解顯然要用狀態壓縮 看資料範圍 設fs i,0 1 2 s表示當前已選擇的積木集合,i表示在最上方的積木編號,0 1 2表示最上方的積木哪面朝上。轉移方程容易推導。暴力...

計數 NOIP2016提高A組模擬7 15

樣例輸入 2 10 樣例輸出 90資料範圍 剖解題目 題目說的很明了了。思路 求方案數,一般會設計道dp,規律之類的。解法 數字dp,設f i j 表示當前到了第i位,這一位的數字是j的方案數。自然有 f i j f i 1 l f i j 0 l k 且 l 0 and j 0 看到這位數,很明顯...

NOIP2016提高A組模擬9 2 單峰

問1 n,n個數的全排列中有多少個滿足單峰序列的性質,並把答案mod 1e9 7 這題還是很簡單的,一開始打了乙個50分的做法,然後發現答案就是2n 1,然後沒有發現輸入也會爆,於是就得了50分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...