复习一下前缀和 差分 二分查找 学习树
单就一个专题写我会烦,所以跳着来
前缀和模板题
P8218 【深进1.例1】求区间和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
前缀和稍作改变 两个 qz[i][j],sum[i][j]
P1719 最大加权矩形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题解 P1719 【最大加权矩形】 - 洛谷专栏 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=150;
int a[N][N],sum[N][N];
int b[N][N];
int main()
{
int n;
cin>>n;
int ans=-999999999;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
b[i][j]=a[i][j]+b[i][j-1];
sum[i][j]=b[i][j]+sum[i-1][j];
}
}
for(int x1=1;x1<=n;x1++)
{
for(int y1=1;y1<=n;y1++)
{
for(int x2=1;x2<=n;x2++)
{
for(int y2=1;y2<=n;y2++)
{
if(x2<x1||y2<y1)continue;
ans=max(ans,sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2]);
}
}
}
}
cout<<ans;
return 0;
}
差分模板题
P2367 语文成绩 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=5000001;
int d[N];
int a[N];
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n,p,min=1e9;
cin>>n>>p;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
d[i]=a[i]-a[i-1];
//差分
}
int x,y,z;
while(p--)
{
cin>>x>>y>>z;
d[x]+=z;
d[y+1]-=z;
}
for(int i=1;i<=n;i++)
{
a[i]=a[i-1]+d[i];
if(min>a[i])
{
min=a[i];
}
}
cout<<min;
return 0;
}
二分模板题
二分首先要求有序数列,不少都是另外开一个函数,在主函数中调用,使结构更加清晰
P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
树
树的深度遍历
P4913 【深基16.例3】二叉树深度 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
已知中序和前序求后序
P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
dfs+邻接表
P5908 猫猫和企鹅 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
lca(最近公共祖先)模板,倍增 看懂了 开心的时候敲一下
P3379 【模板】最近公共祖先(LCA) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- 朴素算法:记录下每个节点的父亲,使节点u,v一步一步地向上找父亲,直到找到相同的“祖先”,即是
所求的答案,时间复杂度O(n) - 优化算法(倍增法):利用二进制的思想,想办法使一步一步向上搜索变成以2^k的向上跳。所以
定义一个f[][]数组,使f[j][i]表示节点i的2^j倍祖先。
也可以用st算法 下回来学