刷漆运动开始……
莘元馆有m+1行,n+1列的座椅,编号分别为0~m,0~n,第0行的座椅已经刷成了红色,第0列的座椅(除位置为(0,0)的刷成了红色)已经刷成了绿色,其他座椅均为白色,现在,OI小组需要粉刷所有那些白色的座椅。
校长的要求是,对于每一个座椅(i,j),它必须与(i-1,j)座椅或(i,j-1)座椅同色。
魂之挽歌想知道,将每一个座椅全都粉刷,一共有多少种方案?
1 1
2
思路:略。
得分:100
ac程序:
var a:array[0..2000,0..2000] of longint;
n,m,i,j,k,sum:longint;
begin
{assign(input,'chair.in'); assign(output,'chair.out');
reset(input); rewrite(output);}
readln(n,m);
for i:=1 to n do
a[i,0]:=1;
for i:=1 to m do
a[0,i]:=1;
a[0,0]:=1;
for i:=1 to n do
for j:=1 to m do
a[i,j]:=(a[i-1,j]+a[i,j-1]) mod 20110926;
writeln(a[n,m]);
{close(input); close(output);}
end.
提交地址:http://hzoi.openjudge.cn/codewaysky/1006/
衡水中学马上就要60周年校庆了,衡中的OI小组都很高兴
于是,他们想出一道水题给大家送分
衡中OI小组想让你计算一下,从y年m月d日到衡水中学的k周年校庆有多少天?
注:衡水中学建校于1951-9-26,1周年校庆是在1952-9-26 输入 第一行三个整数y,m,d(1951<=y<=2011,1<=m<=12,1<=d<=31,保证日期合法)
第二行一个整数k(0输出 一个正整数,表示还有多少天。(如果k周年校庆在y年m月d日已经过了,那么就输出impossible)
样例输入 2011 6 18 60
样例输出 100
思路:直接模拟
得分:100分
ac程序:
const dx:array[1..12] of longint=((31),(28),(31),(30),(31),(30),
(31),(31),(30),(31),(30),(31));
var y,m,d,i,j,k,l,now,sum,day:longint;
fuck:int64;
function run(x:longint):boolean;
begin
if ((x mod 4=0) and (x mod 100<>0)) or (x mod 400=0) then
exit(true)
else exit(false);
end;
procedure print(i,j,l:longint);
begin
if (i=(1951+k)) and (j=9) and (l=26) then
begin writeln(sum);
close(input); close(output); halt;
end;
end;
begin
{assign(input,'day.in'); assign(output,'day.out');
reset(input); rewrite(output);}
readln(y,m,d); readln(k);
{for i:=1 to k do
if run(y+i) then inc(now,366)
else inc(now,365);}
{fuck:=(1951+k)*10000+9*100+26;}
for i:=y to 1951+k do
begin
for j:=m to 12 do
begin
day:=dx[j];
if run(i) and (j=2) then day:=day+1;
for l:=d to day do
begin
print(i,j,l); inc(sum);
end;
d:=1;
end;
m:=1;
end;
writeln('impossible');
{close(input); close(output);}
end.
提交地址:
http://hzoi.openjudge.cn/codewaysky/1004/
为了校庆的新面貌,校长大人决定把学校的大甬路铺上沥青(原来是石板的……)。
这条路被分为N个区域,每次,校长会对工人们发出命令:
(1)把l区域到r区域的路铺好(如果中间某区域已经铺好,就不再铺了)
(2)由于可能有猪仙那样的同学把鞋粘在上面,校长老远一看也不知道是哪个区域,于是就会让工人把l区域到r区域的路全部拆掉(如果中间某区域还没铺好,就不拆了)
在一开始,整条路都还没铺上沥青。
校长在发出了M条命令之后,想知道有多少个区域的路是铺好了的。 输入 第一行,两个数N,M
接下来M行,每行三个数k,l,r,k=1或2,k=1表示把l区域到r区域的路铺上,k=2则表示把l区域到r区域的路拆掉 输出 一个数,即有多少个区域的路是铺好了的
样例输入 5 3 1 1 31 3 52 2 4
样例输出 2
思路:线段树(表示不会)
得分:模拟得30分
ac程序:无
提交地址:http://hzoi.openjudge.cn/codewaysky/1007/
maxingc是不会让魂之挽歌赴汤蹈火的……
衡中和滏阳同在一个平面坐标系上,所有的路都是与坐标轴平行的。
在这个坐标系上,有N个路口,在这些路口上(且仅在这些路口上)可以拐弯,即由平行于一个坐标轴走到平行于另一个坐标轴走。
现在maxingc想让魂之挽歌算一下,从衡中到滏阳,至少要拐几个弯? 输入 第一行,一个数N(N<=100000)
接下来有N+2行,每行有一对坐标,第一行是衡中的坐标,最后一行是滏阳的坐标,中间N行是各个路口的坐标
保证所有坐标绝对值<=2*10^9 输出 一个数,即至少拐多少个弯(如果不能到达,就输出NO)
样例输入 2 0 01 01 1-1 1
样例输出 2
思路:bfs
得分:70分(修改后90分,最后一点tle)
90分程序:
var x,y,dx,dy,ans:array[0..100000] of longint;
v:array[0..100000] of boolean;
n,i,j,k,nowx,nowy,ex,ey,sum:longint;
procedure f;
var t,w,i,tx,ty:longint;
begin
t:=0; w:=1;
dx[1]:=nowx; dy[1]:=nowy;
{v[1]:=true;}
while t<w do
begin
inc(t);
tx:=dx[t]; ty:=dy[t];
for i:=1 to n do
if not v[i] then
if (x[i]<>tx) or (y[i]<>ty) then
if (x[i]=tx) or (y[i]=ty) then
begin
inc(w); dx[w]:=x[i]; dy[w]:=y[i];
ans[w]:=ans[t]+1;
v[i]:=true;
if (dx[w]=ex) or (dy[w]=ey) then
begin sum:=ans[w]; exit; end;
end;
end;
end;
begin
{assign(input,'way.in'); assign(output,'way.out');
reset(input); rewrite(output);}
readln(n);
readln(nowx,nowy);
for i:=1 to n do
readln(x[i],y[i]);
readln(ex,ey);
if (nowx=ex) or (nowy=ey) then writeln(0)
else
begin
f;
if sum=0 then writeln('NO') else writeln(sum);
end;
{close(input); close(output);}
end.