pascal 解题模板(NOIP)

目录:
1.LCA(树上倍增)
2.堆
3.快速乘
4.快速加
5.二分查找
6.拓展欧几里得算法(可求乘法逆元)
7.线段树(建树,lazy标记,修改修改区间值)
8.强连通(taijan)
9.二分图最大匹(匈牙利算法)
10.spfa
11.中国剩余定理
12.catalan数
13.欧拉函数
14.拓扑排序

                  1.LCA 裸代码,可直接套用

function lca(u,v:longint):longint;
var i:longint;
begin
if d[v]>d[u] then
begin
i:=u; u:=v; v:=i;
end;
i:=30;
while d[u]>d[v] do
begin
while d[v]>d[dp[u,i]] do dec(i);
u:=dp[u,i];
end;
if u=v then exit(u);
i:=30;
while i>=0 do
begin
while (i>=0) and (dp[u,i]=dp[v,i]) do dec(i);
if i>=0 then
begin
u:=dp[u,i];
v:=dp[v,i];
end;
end;
exit(f[u]);
end;

                   2.堆(以小根堆为例)

procedure put(x:longint);
var i,j:longint;
begin
inc(len);
a[len]:=x;
i:=len;
while (a[i div 2]>a[i]) and (i>1) do
begin
j:=a[i]; a[i]:=a[i div 2]; a[i div 2]:=j;
i:=i div 2;
end;
end;

function get:longint;
var i,j,d:longint;
begin
get:=a[1];
a[1]:=a[len];
dec(len);
i:=1;
while i*2<=len do
begin
if (i*2+1>len) or (a[i*2+1]>a[i*2]) then j:=i*2
else j:=i*2+1;
if a[i]>a[j] then
begin
d:=a[j]; a[j]:=a[i]; a[i]:=d;
end;
i:=j;
end;
end;

                    3.快速乘

function mul(x,y:int64):int64;
var x1,x2,y1,y2:int64;
begin
y1:=m;
x1:=x; x2:=y;
while x2>0 do
begin
if x2 and 1=1 then y1:=plus(y1,x1) mod k;
x2:=x2 shr 1;
x1:=plus(x1,x1) mod k;
end;
exit(y1);
end;

                4.快速加

function plus(x,y:int64):int64;
var x1,y1,x2,y2:int64;
begin
y1:=0;
x1:=x; x2:=y;
while x2>0 do
begin
if x2 and 1=1 then y1:=((y1 mod k)+(x1 mod k)) mod k;
x2:=x2 shr 1;
x1:=((x1 mod k)+(x1 mod k)) mod k;
end;
exit(y1);
end;

               5.二分查找

procedure qsort(l,r,f:longint);
var k,i,j:longint;
begin
k:=(l+r)div 2;
if a[k]=f then writeln(‘YES’);
if l>r then writeln(‘NO’)
else
begin
if a[k]小于f then qsort(k+1,r,f);
if a[k]>f then qsort(l,k-1,f);
end;
end;

                           6.拓展欧几里得算法

program df;
var a,b,x,y,t:longint;
procedure gcd(a,b:longint);
var t:longint;
begin
if b=0 then
begin
x:=1; y:=0;
end
else
begin
gcd(b,a mod b);
t:=x; //逆元过程
x:=y;
y:=t-(a div b)*y;
end;
end;

                7.线段树(建树,lazy标记,修改修改区间值)

procedure built(x,y,z:longint);
begin
f[z].a:=x;
f[z].b:=y;
if x=y then
begin
f[z].c:=c[x];
exit;
end;
built(x,(x+y) div 2,z*2);
built((x+y) div 2+1,y,z*2+1);
f[z].c:=min(f[z*2].c,f[z*2+1].c);
end;

procedure xiugai(x:longint);
var l,r:longint;
begin
if f[x].d=0 then exit;
inc(f[x*2].d,f[x].d);
inc(f[x*2+1].d,f[x].d);
inc(f[x*2].c,f[x].d);
inc(f[x*2+1].c,f[x].d);
f[x].d:=0;
end;

procedure deal(x,l,r:longint);
var mid:longint;
begin
if (f[x].a=l) and (f[x].b=r) then
begin
inc(f[x].c,z);
inc(f[x].d,z);
exit;
end;
xiugai(x);
mid:=(f[x].a+f[x].b) div 2;
if r<=mid then deal(x*2,l,r)
else
if l>mid then deal(x*2+1,l,r)
else
begin
deal(x*2,l,mid);
deal(x*2+1,mid+1,r);
end;
f[x].c:=min(f[x*2].c,f[x*2+1].c);
end;

                     8.强连通(tarjan)

procedure dfs(x:longint);
var y:longint;
begin
inc(t);
low[x]:=t;
zhan[x]:=true;
re[x]:=true;
if (not re[a[x]]) then dfs(a[x]);
y:=find(a[x]);
if (low[x]>low[y]) and (zhan[y]) then
begin
low[x]:=low[y];
f[x]:=y;
end;
zhan[x]:=false;
end;

                    9.二分图匹配(匈牙利算法)

function check(x:longint):boolean;
var i:longint;
begin
for i:=1 to m do
if (a[x,i]=1) and (not b[i]) then
begin
b[i]:=true;
if (d[i]=0) or (check(d[i])) then
begin
d[i]:=x;
exit(true);
end;
end;
exit(false);
end;

                            10.spfa(以最短路为例)

procedure spfa(x:longint);
var i:point;
h,t,u,y:longint;
begin
fillchar(dis,sizeof(dis),$3f);
fillchar(tm,sizeof(tm),0);
fillchar(b,sizeof(b),false);
h:=0; t:=1; tm[1]:=x; dis[x]:=0; b[x]:=true;
repeat
inc(h);
u:=tm[h];
b[u]:=false;
i:=path[u];
while i<>nil do
begin
y:=i^.ends;
if dis[y]>dis[u]+i^.date then
begin
b[y]:=u;
dis[y]:=dis[u]+i^.date;
if not b[y] then
begin
b[y]:=true;
inc(t);
tm[t]:=y;
end;
end;
i:=i^.next;
end;
until h=t;
end;

太多了,只列了部分,其余结合题目看
中国剩余定理:http://blog.csdn.net/jackleg/article/details/53053173
catalan数:http://blog.csdn.net/jackleg/article/details/53031385
http://blog.csdn.net/jackleg/article/details/53130771
欧拉函数:http://blog.csdn.net/jackleg/article/details/53031595
http://blog.csdn.net/jackleg/article/details/53120040
拓扑排序:http://blog.csdn.net/jackleg/article/details/53117582

posted @ 2016-11-10 17:57  Gxyhqzt  阅读(244)  评论(0)    收藏  举报