开发工具:
文件大小: 8mb
下载次数: 0
上传时间: 2019-10-07
详细说明:
看大小就知道很全啦
查看地址 https://blog.csdn.net/qq_43333395/article/details/98508424
目录:
数据结构:
1.RMQ (区间最值,区间出现最大次数,求区间gcd)
2.二维RMQ求区间最大值 (二维区间极值)
3.线段树模板(模板为区间加法) (线段树染色) (区间最小值)
4.线性基 (求异或第k大)
5.主席树(静态求区间第k小) (区间中小于k的数量和小于k的总和) (区间中第一个大于或等于k的值)
6.权值线段树 (求逆序对)
7.动态主席树 (主席树+树状数组) (区间第k大带修改)
8.树上启发式合并 (查询子树的优化)
9,树状数组模板 (求区间异或和,求逆序对) 扩展
10.区间不重复数字的和 (树状数组)
11.求k维空间中离所给点最近的m个点,并按顺序输出(KD树)
12.LCA (两个节点的公共父节点)
动态规划:
1.LIS (最长上升子序列)
2.有依赖的背包 (附属关系)
3.最长公共子序列(LCS)
4.树形DP
5.状压DP-斯坦纳树
6.背包
7.dp[i]=min(dp[i+1]…dp[i+k]),multset
博弈:
1.NIM博弈 (n堆每次最少取一个)
2.威佐夫博弈(两堆每次取至少一个或一起取一样的)
3.约瑟夫环
4.斐波那契博弈 (取的数依赖于对手刚才取的数)
5.sg函数
数论:
1.数论 素数检验:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验
2.拉格朗日乘子法(求有等式约束条件的极值)
3.裂项(多项式分子分母拆分)
4.扩展欧几里得 (ax+by=c)
5.勾股数 (直角三角形三边长)
6.斯特林公式 (n越大越准确,求n!)
7.牛顿迭代法 (求一元多次方程一个解)
8.同余定理 (a≡b(mod m))
9.线性求所有逆元的方法求 (1~p modp的逆元)
10.中国剩余定理(n个同余方程x≡a1(modp1))
11.二次剩余((ax+k)2≡n(modp)(ax+k)^2≡n(mod p)(ax+k)
2
≡n(modp))
12.十进制矩阵快速幂(n很大很大的时候)
13.欧拉函数
14.费马小定理
15.二阶常系数递推关系求解方法 (a_n=p*a_{n-1}+q*a_{n-2})
16.高斯消元
17.矩阵快速幂
18.分解质因数
19.线性递推式BM(杜教)
20.线性一次方程组解的情况
21.求解行列式的逆矩阵,伴随矩阵,矩阵不全随机数不全
组合数学:
1.循环排列 (与环有关的排列组合)
计算几何:
1.三角形 (求面积))
2.多边形
3.三点求圆心和半径
4.扫描线 (矩形覆盖求面积) (矩形覆盖求周长)
5.凸包 (平面上最远点对)
6.求凸多边形的直径
7.求凸多边形的宽度
8.求凸多边形的最小面积外接矩形
9.半平面交
图论:
基础:前向星
1.最短路(优先队列dijkstra)
2.判断环(tarjan算法)
3.最小生成树(Kruskal 模板)
4.最小生成树(Prim)
5.Dicnic最大流(最小割)
6.无向图最小环(floyd)
7.floyd算法的动态规划(通过部分指定边的最短路)
8.图中找出两点间的最长距离
9.最短路 (spfa)
10.第k短路 (spfa+A*)
11.回文树模板
12.拓扑排序 (模板)
13.次小生成树
14.最小树形图(有向最小生成树)
15.并查集 (普通并查集,带权并查集,)
16.求两个节点的最近公共祖先 (LCA)
17.限制顶点度数的MST(k度限制生成树)
18.多源最短路(spfa,floyd)
19.最短路 (输出字典序最小)
20.最长路
图论题目简述
字符串:
1.字典树(多个字符串的前缀)
2.KMP(关键字搜索)
3.EXKMP(找到S中所有P的匹配)
4.马拉车(最长回文串)
5.寻找两个字符串的最长前后缀(KMP)
6.hash(进制hash,无错hash,多重hash,双hash)
7.后缀数组 (按字典序排字符串后缀)
8.前缀循环节(KMP的fail函数)
9.AC自动机 (n个kmp)
10.后缀自动机
小技巧:
1.关于int,double强转为string
2.输入输出挂
3.低精度加减乘除
4.一些组合数学公式
5.二维坐标的离散化
6.消除向下取整的方法
7.一些常用的数据结构 (STL)
8.Devc++的使用技巧
9.封装好的一维离散化
10.Ubuntu对拍程序
11.常数
12.Codeblocks使用技巧
13.java大数
叮嘱
共173页计算几何:
1三角形(求面积)
2多边形
3三点求圆心和半径
4扫描线(矩形覆盖求面积)(矩形覆盖求周长)
5凸包(平面上最远点对)
6求凸多边形的直径
7求凸多边形的宽度
8求凸多边形的最小面积外接矩形
9半平面交
图论:
基础:前向星
1最短路(优先队列 dijkstra)
2判断环 tarjan算法)
3最小生成树( Kruskal模板)
4最小生成树(Prim)
5 Picnic最大流(最小割)
6无向图最小环(foyd)
7foyd算法的动态规划(通过部分指定边的最短路)
8图中找出两点间的最长距离
9最短路(spfa)
10.第k短路(spfa+A*)
1.回文树模板
12.拓扑排序(模板)
13次小生成树
14最小树形图(有向最小生成树
15并查集(普通并查集带权并查集)
16求两个节点的最近公共祖先(LCA)
17限制顶点度数的MST(k度限制生成树)
18.多源最短路spfa, floyd)
19最短路(输出字典序最小)
20最长路
图论题目简述
字符串
1字典树(多个字符串的前缀)
2KMP(关键字搜索)
3 EXKMP找到S中所有P的匹配)
4马拉车(最长回文串)
5寻找两个字符串的最长前后缀(KMP)
6hash(进制hash,无错hash,多重hash,双hash)
7后缀数组(按字典序排字符串后缀)
8前缀循环节(KMP的fi函数)
9AC自动机(n个kmp)
10.后缀自动机
小技巧
1关于 int double强转为 string
2输入输出挂
3低精度加减乘除
4一些组合数学公式
5二维坐标的离散化
6消除向下取整的方法
7.一些常用的数据结构(STL)
8Dev++的使用技巧
9封装好的一维离散化
10. Ubuntu对拍程序
11.常数
12 Codeblocks使用技巧
13ava大数
数据结构
1RMQ区间最值)
RMQ算法,是一个快速求区间最值的离线算法,预处理时间复杂度O(nog(m),查询O(1),所以是
一个很快速的算法,当然这个问题用线段树同样能够解决。
求区间的最大值和最小值!
#include
using namespace std;
const int maxn=100117
int n, query;
int num[ maxn];
int F Min[ maxn][20],F Max[ maxn][20];
void initof
for(int i=l;i<=n; i++)t
F Min[i][0]=F Max[i][0]=num[i];
for(inti=1;(1
using namespace std;
const int maxn=100017
int num[ maxn],f[maxn], MAX[ maxn][20];
int n
int max(int a, int b)f
return a>ba: b:
int rmq_ max (int l, int r)f
if(l>r
return 0;
int k=log2((double)(r-1+1));
return max(MAX[l][kl, MAXIr-(1<
using namespace std;
#define ll long long
int dp[101][32]
inta[1010]
int n, m, g,Jj
int gcd(int a, int b)[
return b?gcd (b, a%b): a;
void rmq _ initot
for(int j= 1;j<=n;j++)dp[jlo]-aljlj
for(inti=1:(1<mp;
void setTable(t
mp. clear(
for(int i=l; i<=n; i++)t
g=dp[i][0],j=i;
While(j<=n)f
int l=j,r=n;
While(l>1
if(rmg qui(i, mid)==g)l=mid
else r=mid-1
mp[g]+=1-j+1;//相当于二分枚举相加
g= rmq qui(主,j);
int main(i
int tl,r
int cas=1:
scan("Ⅺd",&t);
thile(t--)
printf("Case #%d: \n",cas++);
scanf( %d",&n);
for (int i-1; i<=n; i++) scanf("%",&a[i]);
rma_inito)
scanf( %d",&m);
for(int i=0; i
using namespace std;
intn,m,a[490][489]
int dp[469][48][28][28]
int r1, cl, r2, c2, k1, k2,ans
int main(f
scan+("‰d%d",&n,&m);//二维区间的范围
for(int i=l; i<=n; i++0
for (int j=1: j<=m;3++)0
scanf("%d",&a[i][j])
dp[i]j[0][0]=a[i][j;//初始化
int ul=0,u2=0
hile((1<<(u1+1))<=n)u1+
while((1<<(u2+1))<=m)u2++
for (int i=l; i<=n; i++)i
for(int k=1; k<=u2; k++)
for(intj=1;j+(1<<(k-1)<=m;j++){//列建立RNQ
dp[i][j][e][k]=max(dp[i][j[e][k-1],dp[i][j+(1<<(k-1))][e][k-1]);
for (int i=l; 1<=m; i++
for (int k=l; k<=ul; k++)t
for(intj=1;j+(1<(k-1))<=n;j++){//行建立RMQ
dp[j][i][k][]=max(dp[j[主][k-1][8],dp[j+(1<<(k-1))][i][k-1][e]);
for (int i=1; i<=u1; i++)0
for (int j=l; j<=u2: j++)
for(intk=1;k+(1<<(1-1))<=n;k++){
for(intp=1;p+(1<(j-1))<=m;p++){//行列合并
dp[k][pJ[i][j]=max(dp[k][p][i][j],dp[k][p][i-1][j-1])
dp[k][p][i[j]=max(dp[k][p][i][j],dp[k+(1<<(i-1)][p][i-1][j-1])
dp[k][p]J[i][j=max(dp[k][p][i][j,dp[k][p+(1<<(-1)][i-1][-1])
dp[k][pJ[i][j]=max(dp[k][p][i][j],dp[k+(1<<(i-1))][p+(1<(-1))]
[i-1][j-1]);
scanf("%d",&p);
while(p--)t
scanf("%%d%d%d",&r1,&c1,&r2,&c2);//矩形的两个对角线顶点
k1=k2=8
while((1<<(k1+1))<=(r2-r1+1)k1++;//等于int(log2(r2-1+1)
while((1<<(k2+1))<=(c2-c1+1)k2+;/等于int(10g2(c2-c1+1))
ans=0
//下面相当于分成四块矩形
ans=max(ans,dp[r1][c1][k1][k2])://从(r1,c1)开始长度为2~k1和2^k2
ans=max(ans,dp[r2-(1
using namespace std
typedef long long ll;
const int maxn =1000005
struct tree f
int treelmaxn*4];//线段树
[maxn*4];//延退标记
void init(){//初始化
memset(tree, 0, sizeof (tree))
memset(lz,0, sizeof(lz))
//创建线段树
void build(int root, int l, int r)i
if(1==r){
scanf("%d",&tree [root])
return
int mid =(1 +r)>> 1
build(root < 1, 1, mid);
build(root < 1 1, mid + 1, r);
tree[root]=tree[root<<1]+tree[root<<1|1];//可取模
return;
//单点更新,n为更新值, index为更新点,1r为更新范围
void update(int root, int n, int index, int l, int r)t
if (1
)
tree[root]=n;//更新方式,可以自由改动
int mid =(l+r)>>1
//push_down(rot,mid-1+1,r-mid);若既有点更新又有区间更新,需要这句话
if (index <= mid)
date(root < 1, n, index, l, mid);
else
update(root < 1 1,n, index, mid +1, r)
tree[root]=tree[root<<1]+ tree[root<11];//可取模
oid push_ down (int root, int l
intr){//懒标记下传,若需取模,懒标记均可取模
if (lz[root])i
d=(1+r)
lz[root < 1] += lz[root]
1:
tree [root < 1+=1LL *(mid
lz[root]j
tree[root < 11]+= 1LL *(r-mid
rooti
t]=8
/区间更新,1r为更新范围,LR为线段树范围,add为更新值
void update range(int root, int l, int r, int L, int R, int add)i
push_ down(root,L,R);//应敚在最开始,否则会出借
if(1<=L&&r>=R){
lz[root]+= ILL* add
tree[root]+=1Ll*(R-L+1)*ad;//更新方式
return
int mid =(L +r)>>1
if (mid >=1)update range (root < 1, l,r, L, mid, add);
if (mid r) update range(root < 1 1, 1,r, mid +1,R, add);
tree[root]=tree[root<1]+tre[root<<11];/河可取模
/区间查找
1l query range(int root, int L, int R, int l, int r)t
push down(root,L,R);/应放在最开始,否则会出错
if (l<=l&&r >=r ret
int mid =(L +R)>>1
11 su
if (mid >=1) sum + qu
nge( root<1,L,mid,1,r);//可取模
if (mid r)
sum+= query range(root<1|1,mid+1,R,1,r);/可取模
return sum
TREE
nt mai
int n:
N
// build(int root, int l, int r)
/建树,数组在树中输入,root=1,1r为线段树范围
trees, build(1, 1, N)
/ update range(int root, int l,int r,int L, int R,int add)
//区间更新root为1,1r为更新范围,LR为线段树范围,add为更新值
int x,y, k
trees. update range(l, x, y, 1, N,k);
// update(int n,int index, int l, int r, int root)
/单点更新,n为更新值, index为更新点,1r为线段树范围
int i, k
trees. update(l,k, i, 1, N);
/ query range(int root, int L, int R,int l, int r)
//区间查找root为1,1为更新范围,LR为线段树范围
int x, y
trees. query range(1, 1,N, x, y)
return e
b)线段树染色
在一条线上画一些彩色的部分,一些先前画的部分可能会被后面的部分覆盖。
下面代码可以直接生成涂色后的颜色分布状况。(可以将每个点的颜色输出出来)
#include
include
#include
typedef long long ll
const int maxn=1e5+10:
using namespace std
int tree[maxn<2];/对节点染色
void pushDown( int root){//下传,线段树维护颜色
if(tree[root]!=-1)[
tree[root]=-1
// update(1,1,8098,a+1,b,k);
void update(int root, int L,int R, int l, int r, int k)i
if(1<=L&&r>=R){
[root =k
turn
Pushdot
int mid=(L+R)>>1
if(l<=mid)
update(root<<1, L, mid, l,r, k)
if(r>mid)
date(root<<1 1, mid1, R,I,r, k);
int red[maxn];//存储i节点的颜色
int top=0
void query (int root, int l,int r)i
if(1==r){
rec[tap++]=tree[root];/记录节点的颜色
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.