NOIP模板
快排
- procedure qsort(l,r:longint);
- var i,j,t,m:longint;
- begin i:=l; j:=r;
- m:=a[(i+j) div ];
- repeat
- while a[i]<m do inc(i);
- while m<a[j] do dec(j);
- if i<=j then
- begin t:=a[i]; a[i]:=a[j]; a[j]:=t;
- inc(i); dec(j); end; until i>j;
- if i<r then qsort(i,r); if j>l then qsort(l,j); end;
堆
1.数组开两倍
- procedure insert(x:longint);
- var t,s,v:longint;
- begin
- len:=len+; f[len]:=x; s:=len;
- while (s<>)and(f[s div ]>f[s]) do
- begin
- v:=f[s div ]; f[s div ]:=f[s]; f[s]:=v;
- s:=s div ;
- end;
- end;
- function get:longint;
- var t,s,v:longint;
- begin
- get:=f[]; f[]:=f[len]; len:=len-; t:=;
- while (t*<=len)or(t*+<=len) do
- begin
- if (t*+>len)or(f[t*]<f[t*+])
- then s:=t* else s:=t*+;
- if f[t]>f[s] then
- begin
- v:=f[t]; f[t]:=f[s]; f[s]:=v; t:=s;
- end
- else break;
- end;
- end;
欧拉函数(单个数值)
- function phi(x:longint):longint;
- var ans,i:longint;
- begin
- ans:=x;
- for i:= to trunc(sqrt(x)) do
- begin
- if x mod i= then ans:=ans div i*(i-);
- while x mod i= do x:=x div i;
- end;
- if x<> then ans:=ans div x*(x-);
- exit(ans);
- end;
欧拉函数(批量处理)
- procedure work;
- var i,j:longint;
- begin
- p:=;
- for i:= to n do e[i]:=i;
- for i:= to n do
- if e[i]=i then
- begin j:=i;
- while j<=n do begin e[j]:=e[j] div i*(i-); inc(j,i); end;
- end;
- for i:= to n do
- begin
- if e[i]=i- then begin inc(p); prime[p]:=i; end;
- end;
- end;
质数筛法
- procedure work(n:longint);
- var i,j:longint;
- begin
- num:=;
- for i:= to n do g[i]:=true;
- for i:= to n do
- if g[i]=true then
- begin
- inc(num); prime[num]:=i;
- j:=i*;
- while j<=n do begin g[j]:=false; j:=j+i; end;
- end;
- end;
质因数分解
- procedure fenjie(x:longint);
- var i,y:longint;
- begin
- t:=;y:=x;
- for i:= to num do
- begin
- if prime[i]>y div then exit;
- if x mod prime[i]= then
- begin
- inc(t); w[t]:=prime[i];
- while x mod prime[i]= do x:=x div prime[i];
- end;
- if x= then break;
- end;
- end;
快速幂
- function quick(x,n,p:qword):qword;
- var ans:qword;
- begin
- ans:=;
- while n> do
- begin
- if n and > then ans:=cheng(ans,x,p);
- x:=cheng(x,x,p);
- n:=n>>;
- end;
- exit(ans);
- end;
快速乘
- function cheng(x,n,p:qword):qword;
- var ans:qword;
- begin
- ans:=;
- while n> do
- begin
- if n and > then ans:=(ans+x) mod p;
- x:=(x+x) mod p;
- n:=n>>;
- end;
- exit(ans);
- end;
拓扑排序
- for i:= to n do if u[i]= then begin inc(t); f[t]:=i; end;
- repeat
- x:=f[t]; dec(t); inc(num);
- new(p); p:=a[x];
- while p<>nil do
- begin
- y:=p^.data;
- dec(u[y]);
- if u[y]= then
- begin
- inc(t); f[t]:=y;
- end;
- p:=p^.next;
- end;
- until num=n;
强连通分量tarjan
思路:dfn为遍历到各点的时间,low表示每个点能够追溯到的最早的栈中节点的次序号 instack表示结点是否在栈中。
对图遍历如果x的儿子y没访问过,则访问并用low[y]更行low[x],如果x的儿子y被访问过,则用dfn[y]更新low[x],这样就知道了x最早回溯到的点(在栈中),在栈中low[x]相等的值构成强连通分量。
- procedure tarjan(x:longint);
- var y:longint; p:point;
- begin
- inc(s); low[x]:=s; dfn[x]:=s; inc(t); q[t]:=x;
- instack[x]:=true;
- new(p); p:=a[x];
- while p<>nil do
- begin
- y:=p^.x;
- if dfn[y]= then begin tarjan(y); low[x]:=min(low[x],low[y]); end
- else if instack[y]=true then low[x]:=min(low[x],dfn[y]);
- p:=p^.next;
- end;
- if dfn[x]=low[x] then
- begin
- inc(num);
- repeat
- y:=q[t]; dec(t); f[y]:=x;instack[y]:=false;
- until x=y;
- end;
- end;
主程序
- for i:= to n do begin dfn[i]:=; low[i]:=; w[i]:=; instack[i]:=false; end;
- s:=; t:=; num:=;
- for i:= to n do if dfn[i]= then tarjan(i);
树的直径
思路:求树上最长路,对于各个点,求出它儿子中最长和次长的链相加。
- procedure dfs(x,e:longint);
- var p:point; y:longint;
- begin
- s1[x]:=x; s2[x]:=x; new(p); p:=a[x];
- while p<>nil do
- begin
- y:=p^.x;
- if y=e then begin p:=p^.next; continue; end;
- dfs(y,x);
- if f1[y]+p^.v>f1[x] then
- begin
- f2[x]:=f1[x]; s2[x]:=s1[x];
- f1[x]:=f1[y]+p^.v; s1[x]:=y;
- end
- else
- if f1[y]+p^.v>f2[x] then
- begin
- f2[x]:=f1[y]+p^.v; s2[x]:=y;
- end;
- p:=p^.next;
- end;
- if f1[x]+f2[x]>f1[max]+f2[max] then
- max:=x;
- end;
kmp算法
- p[]:=; j:=;
- for i:= to m do
- begin
- while (j>)and(b[j+]<>b[i]) do j:=p[j];
- if b[j+]=b[i] then inc(j);
- p[i]:=j;
- end;
- j:=; kmp:=;
- for i:= to n do
- begin
- while (j>)and(b[j+]<>a[i]) do j:=p[j];
- if b[j+]=a[i] then inc(j);
- if j=m then begin inc(kmp); j:=p[j]; end;
- end;
LCA
倍增
1.不要忘记dfs后调用work
2.注意枚举2^i时要包含0,注意顺序
- procedure work;
- var i,j:longint;
- begin
- for i:= to do
- for j:= to n do
- f[i+,j]:=f[i,f[i,j]];
- end;
- function lca(x,y:longint):longint;
- var i,t:longint;
- begin
- if deep[x]<deep[y] then begin t:=x; x:=y; y:=t; end;
- for i:= downto do
- if ((deep[x]-deep[y])>>i)and = then x:=f[i,x];
- if x=y then exit(x);
- for i:= downto do
- if f[i,x]<>f[i,y] then
- begin x:=f[i,x]; y:=f[i,y]; end;
- exit(f[,x]);
- end;
二分图
染色
- function dfs(x,color:longint):boolean;
- var p:point; y:longint;
- begin
- new(p); p:=w[x]; g[x]:=color;
- while p<>nil do
- begin
- y:=p^.x;
- if g[y]=color then exit(false);
- if (g[y]=)and(not dfs(y,-color)) then exit(false);
- p:=p^.next;
- end;
- exit(true);
- end;
- function cheak(s:longint):boolean;
- var i:longint;
- begin
- for i:= to n do g[i]:=;
- for i:= to n do
- if g[i]= then
- if not dfs(i,) then exit(false);
- exit(true);
- end;
组合
费马小定理,快速求C(n,m)的值
- procedure make;
- var i:longint;
- begin
- f[]:=; g[]:=;
- for i:= to n do
- begin
- f[i]:=(f[i-]*i) mod num;
- g[i]:=g[i-]*quick(i,num-) mod num;
- end;
- end;
- function get(x,y:int64):int64;
- var i:longint; t:int64;
- begin
- if (x=)or(y=)or(x=y) then exit();
- exit(((f[x]*g[x-y]) mod num)*g[y] mod num);
- end;
同余
ax≡1(mod m)
- program asdf;
- var
- a,m,x,y,t:longint;
- function extgcd(a,b:longint;var x,y:longint):longint;
- var d:longint;
- begin
- if b<> then begin d:=extgcd(b,a mod b,y,x); y:=y-(a div b)*x; end
- else begin x:=;y:=; d:=a; end;
- exit(d);
- end;
- begin
- readln(a,m);
- x:=; y:=;
- t:=extgcd(a,m,x,y);
- writeln((x+m) mod m);
- end.
NOIP模板的更多相关文章
- NOIP模板总结
NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...
- NOIP模板整理计划
先占个坑 [update]noip结束了,弃了 一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 #include <iostream> #include < ...
- 【模板】NOIP模板汇总
图论 数据结构 数学 其他: 洛谷模板:a,b两个字符串,求b串在a串中出现的位置 #include<iostream> #include<cstdio> #include&l ...
- noip模板复习
自己敲模板还是有很多容易错的地方 写在注释里面了 LCA #include<bits/stdc++.h> #define REP(i, a, b) for(register int i = ...
- NOIP经典基础模板总结
date: 20180820 spj: 距离NOIP还有81天 目录 STL模板: priority_queue 的用法:重载<,struct cmpqueue 的用法 stack 的用法vec ...
- NOIP常见模板集合
Preface 这篇博客记录的是我联赛前虽然只有两天了的打板子记录. 只求真的能给我起到些作用吧,一般按照难度排序. 而且从这篇博客开始我会用H3的标题代替H4 为了节约篇幅,以下的代码一般均以cla ...
- NOIP前的模板复习和注意事项
联赛除去今天刚好只有一个星期了,最后一个星期也很关键,要吃好睡好保持心情愉悦.当然也免不了最后的复习计划. 首先是模板,之前还有很多模板没有复习到,这些东西是一定要落实到位的. 每天往后面写一点... ...
- NOIP的模板--考前复习
距离NOIP还有25天 可以去放弃一些巨难得题目去搞一些模板了 -------在校老师的原话 一·快排 虽然可以手打,最好用STL,里面有很多优化,会快很多 #include<iostream& ...
- 纪中10日T1 2300. 【noip普及组第一题】模板题
2300. [noip普及组第一题]模板题 (File IO): input:template.in output:template.out 时间限制: 1000 ms 空间限制: 262144 K ...
随机推荐
- 剑指offer—从头到尾打印链表
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 递归添加...不为空就加 import java.util.ArrayList; public class Solution { pu ...
- jquery点击按钮复制内容
做移动端的项目遇到一个需求要点击按钮复制dom里的内容,看了很多资料显示必须textarea或者input里的内容才能简单复制,还有就是用插件的了,最终都因为遇到各种问题放弃,最终选择了最简单的点击复 ...
- java 时间转换去杠
public static String minusHyphen(String dateParam){ if(dateParam ==null) return null; if(dateParam.i ...
- SpringBoot学习(1)
springboot的自动配置功能,主要流程如下: 1 启动的时候加载我们的主配置类,也就是我们的入口类:从而开启我们的自动配置配置功能,这个是通过@EnableAutoConfiguration注解 ...
- py函数初识
一. 什么是函数 1. 我们到目前为止, 已经可以完成一些软件的基础功能了. 那么我们来完成这样一个功能: 约x print("拿出手机") print("打开陌&quo ...
- 利用nodejs实现商品管理系统(一)
一.界面分类:用户登录界面,商品管理界面(包含商品编辑,创建,删除,列表界面) 功能实现:1.用户输入用户名与密码,通过加密,与数据库校验,如果正确,则跳转到商品管理界面,否则一直停留在用户界面. 2 ...
- LOOP AT SCREEN
用法 主に.画面の属性を変更させるために使用する. 照会モードでは入力不可とするが入力可能モードでは入力可能とする.ラジオボタンAが選択された場合はラジオボタンBに関連する項目は非表示とするなど. ...
- java 第五章 方法定义及调用
1.方法的定义 什么是方法 方法是完成某个功能的一组语句,通常将常用的功能写成一个方法 方法的定义 [访问控制符] [修饰符] 返回值类型 方法名( (参数类型 形式参数, ,参数类型 形式参数, , ...
- oracle 数据被修改怎么修复?(闪回)
数据被删除 或者 update 的时候忘记勾选where 限制条件,数据全部更新了? 怎么办? 要跑路了? NO !!! 看下面,迅速帮你闪回数据! demo sql: 1. SELECT * FR ...
- java字符流实现文件间的内容复制
package com.io.demo1; import java.io.FileReader; import java.io.FileWriter; public class TestFileSTr ...