求余数……
Program P3980;
var
a,b:longint;
begin
while not seekeof do
begin
read(a,b);
writeln(a mod b);
end;
end.
求余数……
Program P3980;
var
a,b:longint;
begin
while not seekeof do
begin
read(a,b);
writeln(a mod b);
end;
end.
搜索 此题数据小,不需要状压
Program P1856;
var
n,m,i,j,ans:longint;
c:char;
f:array[0..1010,0..1010] of boolean;
function find(x,y:longint):boolean;
var
i,j,k,l:longint;
begin
i:=x;j:=y;
while f[x,j] do inc(j);
dec(j);
while f[i,y] do inc(i);
dec(i);
for k:=x to i do
for l:=y to j do
begin
if not(f[k,l]) then exit(false);
f[k,l]:=false;
end;
for k:=x-1 to i+1 do
if f[k,j+1] or f[k,y-1] then exit(false);
for l:=y to j do
if f[i+1,l] or f[x-1,l] then exit(false);
exit(true);
end;
function main:boolean;
var
i,j:longint;
begin
ans:=0;
for i:=1 to n do
for j:=1 to m do
if f[i,j] then
begin
if not(find(i,j)) then exit(false)
else inc(ans);
end;
exit(true);
end;
begin
while not seekeof do
begin
fillchar(f,sizeof(f),false);
readln(n,m);
if (n+m=0) then break;
for i:=1 to n do
begin
for j:=1 to m do
begin
read(c);
if c='#' then f[i,j]:=true;
end;
readln;
end;
if main then writeln('There are ',ans,' ships.')
else writeln('Bad placement.');
end;
end.
求割点入门题!
……死调一下午+晚上才发现把‘node'打成’nodes'了……
Program P1523;
const
maxedge=999000;
maxn=10000;
var
edge,tail:array[1..maxedge] of longint;
size:longint;
head:array[1..maxn] of longint;
n,i,j,ans,k:longint;
b,cut:array[1..maxn] of boolean;
time,root:longint;
a,d,ancestor,c:array[1..maxn] of longint;
procedure addedge(u,v:longint);
begin
inc(size);
edge[size]:=v;
tail[size]:=head[u];
head[u]:=size;
end;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
procedure Dfs(k,father,deep:longint);
var
i,j,p,tot:longint;
begin
tot:=0;
c[k]:=1;
d[k]:=deep;
ancestor[k]:=deep;
p:=head[k];
while (p>0) do
begin
i:=edge[p];
if (i<>father) and (c[i]=1) then ancestor[k]:=min(ancestor[k],d[i]);
if (c[i]=0) then
begin
dfs(i,k,deep+1);
inc(tot);
ancestor[k]:=min(ancestor[k],ancestor[i]);
if (k=root) and (tot>=2) then cut[k]:=true;
if (k<>root) and (ancestor[i]>=d[k]) then cut[k]:=true;
end;
p:=tail[p];
end;
c[k]:=2;
inc(time);
a[k]:=time;
end;
procedure Dfs2(k:longint);
var
i,p:longint;
begin
b[k]:=true;
p:=head[k];
while (p>0) do
begin
i:=edge[p];
if not(b[i]) then
begin
dfs2(i);
end;
p:=tail[p];
end;
end;
function main:boolean;
var
i,j,p,ans:longint;
begin
time:=0;
main:=false;
for i:=1 to maxn do
if (head[i]>0) and (c[i]=0) then
begin
root:=i;
dfs(root,0,1);
end;
for i:=1 to maxn do
if cut[i] then
begin
main:=true;
ans:=0;
fillchar(b,sizeof(b),false);
b[i]:=true;
p:=head[i];
while (p>0) do
begin
if not(b[edge[p]]) then
begin
dfs2(edge[p]);
inc(ans);
end;
p:=tail[p];
end;
writeln(' SPF node ',i,' leaves ',ans,' subnets');
end;
end;
begin
{ assign(input,'p1523.in');
reset(input);
}
k:=1;
while not seekeof do
begin
size:=0;
fillchar(head,sizeof(head),0);
fillchar(edge,sizeof(edge),0);
fillchar(tail,sizeof(tail),0);
fillchar(cut,sizeof(cut),false);
fillchar(c,sizeof(c),0);
fillchar(d,sizeof(d),0);
fillchar(ancestor,sizeof(ancestor),0);
read(i);
if i=0 then break;
read(j);
while (i>0) do
begin
addedge(i,j);
addedge(j,i);
read(i);
if i=0 then break;
read(j);
end;
ans:=0;
writeln('Network #',k);
if not(main) then writeln(' No SPF nodes');
writeln;
inc(k);
end;
end.
线段树……
Program p2777;
const
maxl=100000;
maxt=30;
maxo=100000;
var
l,t,o,i,j,k:longint;
col:array[1..maxl*10] of longint;
c:char;
x,y,color:longint;
visit:array[1..maxt] of boolean;
procedure build(l,r,root:longint);
var
mid:longint;
begin
if l=r then
begin
col[root]:=1;
exit;
end;
mid:=(l+r) shr 1;
build(l,mid,root shl 1);
build(mid+1,r,root shl 1+1);
col[root]:=1;
end;
procedure swap(var a,b:longint);
var
p:longint;
begin
p:=a;a:=b;b:=p;
end;
procedure detate(l,r,sonl,sonr,root,color:longint);
var
i,j,mid:longint;
begin
mid:=(l+r) shr 1;
if l=r then
begin
col[root]:=color;
exit;
end;
if (sonl<=l) and (r<=sonr) then
begin
col[root]:=color;
exit;
end;
if col[root]>0 then
begin
col[root*2]:=col[root];
col[root*2+1]:=col[root];
col[root]:=-1;
end;
if not((mid<sonl) or (sonr<l)) then detate(l,mid,sonl,sonr,root shl 1,color);
if not((r<sonl) or (sonr<mid+1)) then detate(mid+1,r,sonl,sonr,root shl 1+1,color);
end;
function quere(l,r,sonl,sonr,root:longint):longint;
var
mid,i,j:longint;
begin
quere:=0;
mid:=(l+r) shr 1;
if col[root]>0 then
begin
if not(visit[col[root]]) then
begin
visit[col[root]]:=true;
exit(1);
end;
exit(0);
end;
if not((mid<sonl) or (sonr<l)) then inc(quere,quere(l,mid,sonl,sonr,root shl 1));
if not((r<sonl) or (sonr<mid+1)) then inc(quere,quere(mid+1,r,sonl,sonr,root shl 1+1));
end;
begin
readln(l,t,o);
build(1,l,1);
for i:=1 to o do
begin
read(c);
if c='C' then
begin
readln(x,y,color);
if x>y then swap(x,y);
detate(1,l,x,y,1,color);
end
else
begin
readln(x,y);
if x>y then swap(x,y);
fillchar(visit,sizeof(visit),false);
writeln(quere(1,l,x,y,1));
end;
end;
end.
这题的数据太水……
居然不需要2分Log n查找……尽管我也不知道上限是多少……
Program P3100;
var
a,b,n,i,j,dis:longint;
function pow(a,b:longint):longint;
var
i:longint;
begin
if a=0 then exit(0);
if a=1 then exit(1);
if b=0 then exit(0);
if b=1 then exit(a)
else
begin
pow:=pow(a,b shr 1);
if (b mod 2=0) then
begin
exit(pow*pow);
end
else exit(pow*pow*a);
end;
end;
begin
read(b,n);
while (b+n>0) do
begin
i:=0;
while (pow(i,n)<b) do
begin
dis:=b-pow(i,n);
inc(i);
end;
if (pow(i,n)-b>dis) then writeln(i-1) else writeln(i);
read(b,n);
end;
end.
Dp 神奇的状态转移……
Program fd;
const
mo=1000000007;
var
n,i,j:longint;
c,tot:array[1..15] of longint;
f:array[0..15,0..15,0..15,0..15,0..15,0..15] of int64;
function dfs(a1,a2,a3,a4,a5,last:longint):int64;
var
i,j:longint;
ans,q:int64;
a:array[1..5] of longint;
begin
if f[a1,a2,a3,a4,a5,last]>0 then exit(f[a1,a2,a3,a4,a5,last]);
a[1]:=a1;a[2]:=a2;a[3]:=a3;a[4]:=a4;a[5]:=a5;
ans:=0;
for i:=1 to 5 do
if (a[i]>0) then
begin
if (last=i+1) and (a[i]=1) then continue;
// if (last=i+1) then dec(a[i]);
dec(a[i]);
if i>1 then inc(a[i-1]);
q:=dfs(a[1],a[2],a[3],a[4],a[5],i);
inc(a[i]);
if i>1 then dec(a[i-1]);
if last=i+1 then ans:=(ans+(a[i]-1)*q) mod mo
else ans:=(ans+a[i]*q) mod mo;
// if (last=i+1) then inc(a[i]);
end;
f[a1,a2,a3,a4,a5,last]:=ans;
exit(ans);
end;
begin
read(n);
fillchar(tot,sizeof(tot),0);
for i:=1 to n do
begin
read(c[i]);
inc(tot[c[i]]);
end;
fillchar(f,sizeof(f),0);
for i:=1 to n do f[0,0,0,0,0,i]:=1;
writeln(dfs(tot[1],tot[2],tot[3],tot[4],tot[5],0));
end.
让每个人每局都与可战胜的人中最强的打,看有无可行解……
Program p1818;
var
n,x,k,i,j,mid:longint;
q:array[1..5100] of longint;
f:array[1..5100] of longint;
function max(a,b:longint):longint;
begin
if a<b then exit(b) else exit(a);
end;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
function is_ac(person:longint):boolean;
var
i,j,l,h,t:longint;
size:longint;
begin
fillchar(f,sizeof(f),0);
fillchar(q,sizeof(q),0);
q[1]:=person;
size:=1;
f[person]:=1;
h:=1;t:=1;
for l:=2 to x+1 do
begin
for i:=h to t do
begin
for j:=max(1,q[i]-k) to n do
begin
if f[j]=0 then
begin
inc(size);
q[size]:=j;
f[j]:=l;
break;
end;
end;
end;
t:=size;
end;
if (size<n) then exit(false)
else exit(true);
end;
begin
read(n,k);
x:=0;
i:=1;
while (i<n) do
begin
inc(x);
i:=i shl 1;
end;
i:=1;j:=n;
if is_ac(j) then i:=j;
while (j-i>1) do
begin
mid:=(i+j) shr 1;
if is_ac(mid) then i:=mid else j:=mid;
end;
writeln(i);
end.
此题纯模拟也能过……
我更懒,直接记栈尾元素和已出元素……
Program P1363;
var
n,i:longint;
a:array[1..1000] of longint;
b:array[0..1000] of boolean;
t:longint;
tag:boolean;
begin
read(n);
while (n>0) do
begin
read(a[1]);
while (a[1]>0) do
begin
fillchar(b,sizeof(b),false);
for i:=2 to n do read(a[i]);
t:=a[1];
b[t]:=true;
dec(t);
tag:=false;
for i:=2 to n do
begin
if not(b[a[i]]) then
begin
if a[i]>t then
begin
t:=a[i];
b[t]:=true;
dec(t);
while b[t] do dec(t);
end
else if a[i]=t then
begin
b[t]:=true;
dec(t);
while b[t] do dec(t);
end
else
begin
writeln('No');
tag:=true;
break;
end;
end
else
begin
writeln('No');
tag:=true;
break;
end;
end;
if not(tag) then writeln('Yes');
read(a[1]);
end;
writeln;
read(n);
end;
end.
本题乍一看链表,实际上肯定超时%……
故用线段树 LogN查找……
Program P2828;
const
maxn=200000;
var
n,i,j:longint;
pos,val:array[1..maxn] of longint;
sum:array[1..maxn*10] of longint;
ans:array[1..maxn] of longint;
procedure pushup(root:longint);
begin
sum[root]:=sum[root*2]+sum[root*2+1];
end;
procedure build(l,r,root:longint);
var
mid:longint;
begin
if l=r then
begin
sum[root]:=1;
exit;
end;
mid:=(l+r) shr 1;
build(l,mid,root*2);
build(mid+1,r,root*2+1);
pushup(root);
end;
procedure decr(l,r,root,node:longint);
var
mid:longint;
begin
if l=r then
begin
dec(sum[root]);
exit;
end;
mid:=(l+r) shr 1;
if (node<=mid) then decr(l,mid,root shl 1,node)
else decr(mid+1,r,root shl 1+1,node);
pushup(root);
end;
function find(l,r,root,value:longint):longint;
var
mid:longint;
begin
mid:=(l+r) shr 1;
if l=r then
begin
decr(1,n,1,l);
exit(l);
end;
if (sum[root shl 1]>=value) then exit(find(l,mid,root shl 1,value))
else exit(find(mid+1,r,root shl 1+1,value-sum[root shl 1]));
end;
begin
while not seekeof do
begin
read(n);
for i:=1 to n do read(pos[i],val[i]);
build(1,n,1);
for i:=n downto 1 do
begin
ans[find(1,n,1,pos[i]+1)]:=val[i];
end;
for i:=1 to n-1 do write(ans[i],' ');
writeln(ans[n]);
end;
end.
此题数据有误……
是我英文太差,还是答案出错……
Program P2528;
const
maxn=10000;
maxr=10000000;
var
t,n,i,j,k:longint;
a,b,v:array[1..maxn*2] of longint;
h:array[1..maxr] of longint;
col:array[1..maxn*100] of longint;
visit:array[1..maxn*2] of boolean;
procedure qsort(l,r:longint);
var
i,j,m,p:longint;
begin
i:=l;
j:=r;
m:=v[(l+r) div 2];
repeat
while v[i]<m do inc(i);
while v[j]>m do dec(j);
if i<=j then
begin
p:=v[i];
v[i]:=v[j];
v[j]:=p;
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
procedure update(l,r,sonl,sonr,root,color:longint);
var
i,j,k,mid:longint;
begin
mid:=(l+r) shr 1;
if (sonl<=l) and (r<=sonr) then
begin
col[root]:=color;
exit;
end;
if (col[root]>=0) then
begin
col[root*2]:=col[root];
col[root*2+1]:=col[root];
col[root]:=-1;
end;
if not((mid<sonl) or (sonr<l)) then update(l,mid,sonl,sonr,root*2,color);
if not((r<sonl) or (sonr<mid+1)) then update(mid+1,r,sonl,sonr,root*2+1,color);
end;
function dfs(l,r,root:longint):longint;
var
i,j,mid:longint;
begin
mid:=(l+r) shr 1;
if col[root]=0 then exit(0);
if col[root]>0 then
begin
if not(visit[col[root]]) then
begin
visit[col[root]]:=true;
exit(1);
end
else exit(0);
end;
exit(dfs(l,mid,root*2)+dfs(mid+1,r,root*2+1));
end;
begin
read(t);
while t>0 do
begin
dec(t);
read(n);
for i:=1 to n do
begin
read(a[i],b[i]);
v[i]:=a[i];
v[n+i]:=b[i];
end;
qsort(1,2*n);
j:=1;
for i:=2 to 2*n do
if v[i]<>v[i-1] then
begin
inc(j);
v[j]:=v[i];
end;
for i:=1 to j do h[v[i]]:=i;
fillchar(col,sizeof(col),0);
for i:=1 to n do
begin
update(1,j,h[a[i]],h[b[i]],1,i);
end;
fillchar(visit,sizeof(visit),false);
writeln(dfs(1,j,1));
end;
end.