随笔分类 - 算法
摘要:#T1 洛谷P3374 树状数组2 ###题目描述 如题,已知一个数列,你需要进行下面两种操作: ·将某一个数加上 xxx ·求出某区间每一个数的和 ###输入格式 第一行包含两个正整数 n,mn,mn,m,分别表示该数列数字的个数和操作的总个数。 第二行包含 nnn 个用空格分隔的整数,其中第 i
阅读全文
摘要:#树状数组 ###定义 ·已知一个数列,你需要进行下面两个操作: ·将某一个数加上x ·求出区间的和 ####例: lowbit(x):x的二进制表示中最低位的1所表示的数值 lowbit(20)=lowbit(10100)=00100=4 int lowbit(int x){ return x&(
阅读全文
摘要:#ST表 ###定义 ·也叫RMQ算法 ·给定序列,要求O(1)求区间(l,r)的最小值 ·F[i][j]代表i到i+2j-1的最小值。 ·F[i][j]=min(f[i][j-1],f[i+2(j-1)][j-1]) ·O(nlogn)预处理 设k为最大的正整数满足2k<=r-l+1 Min(l,
阅读全文
摘要:#树上背包 给一颗树,每个节点上有一个物品,每个体积为wi,价值为vi。 选了一个点必须选它的父亲。 问总体积不超过m的情况下总价值最大值 f[u][j]代表在以u为根的子树中,选了j的体积,能得到的最大价值 ·首先i一定要选 ·枚举给每个子树v分配多少体积k f[u][j]=max(f[u][j]
阅读全文
摘要:#LCA ###倍增 f[i][j]代表i的2^j级父亲 f[i][j]=f[f[i][j-1]][j-1] 有了f数组,如何计算“u向上跳k步到达哪个点”? 对k作二进制分解,枚举所有二进制位。 如果第i位为1,那么令u=f[u][i] O(nlogn) 预处理 for(int i=1;i<=n;
阅读全文
摘要:#tarjan算法 无向图的上的tarjan与有向图同理,只不过没有横叉边。 对于边(u,v),若low[v]>dfn[u],则 (u,v)是桥,若low[v]>=dfn[u],则u是割点(只有一个儿子的根节点除外) void tarjan(int u,int fa){ dfn[u]=low[u]=
阅读全文
摘要:#单源最短路 void spfa(){ memset(dis,0x3f,sizeof(dis)); dis[s]=0; z[top=1]=s; for(int j=1;j<=top;j++){ int now=z[j];vis[now]=0; for(int i=head[now];i;i=nxt[
阅读全文