NOIP2016提高A組模擬9 14 灌水

2021-07-23 00:02:47 字數 3325 閱讀 6916

輸入 第一行n,m

後面有乙個乙個數出現的為詢問數q

sample input

1 2

01 4

0 0

2 0

0 1

0 2sample output

0.7854

4.8584

0.0000

4.8584

分情況討論,每一次有乙個詢問的點我們就把它可以到達的不在隔板上的點dfs出來,然後再隨便討論一下就好了

感覺自己好隨意啊

var

a,b:array[-1..305,-1..305]of longint;

bz,bz1:array[-1..205,-1..205]of boolean;

s:array[0..40005,1..2]of longint;

h:array[1..8,1..2]of longint=((-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1));

g:array[1..2,1..2]of longint=((1,-1),(1,1));

nc:array[1..4,1..2]of longint=((-1,-1),(-1,0),(0,-1),(0,0));

i,j,k,l,n,m,t1,t2,q,z,zz,o:longint;

ans:extended;

x:char;

procedure

dfs(t1,t2:longint);

var i,x,y:longint;

begin

for i:=1to8

dobegin

x:=t1+h[i,1];

y:=t2+h[i,2];

if (x<0) or (y<0) or (x>n*2) or (y>m*2) then

continue;

if bz[x,y]=true

then

continue;

if (xand (yand (b[t1-1,t2-1]>0) then

continue;

if (xand (y>t2) and (b[t1-1,t2]>0) then

continue;

if (x>t1) and (yand (b[t1,t2-1]>0) then

continue;

if (x>t1) and (y>t2) and (b[t1,t2]>0) then

continue;

inc(z);

s[z,1]:=x;

s[z,2]:=y;

bz[x,y]:=true;

dfs(x,y);

end;

end;

begin

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

readln(n,m);

for i:=1

to n do

begin

for j:=1

to m do

begin

read(x);

t1:=(i-1)*2;

t2:=(j-1)*2;

bz1[t1+1,t2]:=true;

bz1[t1,t2+1]:=true;

bz1[t1+1,t2+2]:=true;

bz1[t1+2,t2+1]:=true;

if x='0'

then

begin

b[t1,t2]:=1;

b[t1+1,t2+1]:=2;

endelse

begin

b[t1,t2+1]:=3;

b[t1+1,t2]:=4;

end;

end;

readln;

end;

readln(q);

for o:=1

to q do

begin

readln(t1,t2);

bz:=bz1;

if bz1[t1,t2]=true

then

begin

writeln('0.0000');

continue;

end;

bz[t1,t2]:=true;

z:=1;

s[z,1]:=t1;

s[z,2]:=t2;

dfs(t1,t2);

fillchar(bz,sizeof(bz),0);

zz:=z;

for i:=1

to z do

bz[s[i,1],s[i,2]]:=true;

ans:=0;

for i:=1

to z do

begin

for j:=1to2

doif bz[s[i,1]+g[j,1],s[i,2]+g[j,2]]=true

then ans:=ans+1;

for j:=1to4

dobegin

t1:=s[i,1]+nc[j,1];

t2:=s[i,2]+nc[j,2];

if (t1<0) or (t2<0) or (t1>n*2) or (t2>m*2) then

continue;

if (j=1) and (b[t1,t2]=1) then ans:=ans+1-0.25*pi else

if (j=1) and (b[t1,t2]=2) then ans:=ans+0.25*pi else

if (j=2) and (b[t1,t2]=3) then ans:=ans+1-0.25*pi else

if (j=2) and (b[t1,t2]=4) then ans:=ans+0.25*pi else

if (j=3) and (b[t1,t2]=3) then ans:=ans+0.25*pi else

if (j=3) and (b[t1,t2]=4) then ans:=ans+1-0.25*pi else

if (j=4) and (b[t1,t2]=1) then ans:=ans+0.25*pi else

if (j=4) and (b[t1,t2]=2) then ans:=ans+1-0.25*pi;

end;

end;

writeln(ans:0:4);

end;

// close(input);

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分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...