马上要去西安打邀请赛了,存下板子

首先是vector存图的:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1
const int M = 2e5+10;
int fa[M],dep[M],siz[M],son[M],tid[M],top[M],rk[M];
void dfs1(int u,int faz,int deep){/*u:  当前节点faz: 父亲节点deep: 深度*///更新所有和当前节点连接的节点dep[u] = deep;fa[u] = faz;siz[u] = 1;for(int i = 0;i < g[u].size();i++){int v = g[u][i];//如果连接的节点是当前节点的父亲节点if(v!=fa[u]){dfs(v,u,deep+1);//收敛的时候将当前节点的siz加上子节点的siz[u] += siz[v];//如果没有设置过重儿子或者子节点的siz值大于之前记录的重儿子的siz,则进行更新if(son[u] == -1||siz[v] > siz[son[u]])son[u] = v;}}
}void dfs2(int u,int t){/*u:当前节点t:起始的重节点*/top[u] = t;  //设置当前节点的起始点为ttid[u] = cnt; //设置当前节点的dfs执行序号rk[cnt] = u;  //设置dfs序号对应成当前节点cnt++;//如果当前节点没有处在重链上,则不处理if(son[u] == -1){return ;}//将这条重链上所有的节点的起始的重节点都设置成t
    dfs2(son[u],t);//遍历所有和当前节点连接的节点for(int i = 0;i < g[u].size();i++){int v = g[u][i];//如果连接节点不是当前节点的重让太子也不是u的父亲节点则将其top设置为自己,进一步递归if(v != son[u] && v != fa[u]){dfs2(v,v);}}
}void pushup(int rt){sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}void update(int p,int c,int l,int r,int rt){if(l == r){sum[rt] += c;return ;}mid;if(p <= m) update(p,c,lson);else update(p,c,rson);pushup(rt);
}ll query(int L,int R,int l,int r,int rt){if(L <= l&&R >= r) return sum[rt];mid;ll ret = 0;if(L <= m) ret += query(L,R,lson);if(R > m) ret += query(L,R,rson);return ret;
}ll ask(int x,int y){   //求两结点路径上的权值和int fx = top[x],fy = top[y];ll ans = 0;while(fx != fy){if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);ans += query(tid[fx],tid[x],1,n,1);x = fa[fx]; fx = top[x];}ans += (dep[x] > dep[y])?query(tid[y],tid[x],1,n,1):query(tid[x],tid[y],1,n,1);return ans;
}

不会链式前向星,存个链式前向星的数剖板子,免得碰到要用的时候装死

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1
const int MAXN = (100000 << 2) + 10;
​
//Heavy-light Decomposition STARTS FORM HERE
int siz[MAXN];//number of son
int top[MAXN];//top of the heavy link
int son[MAXN];//heavy son of the node
int dep[MAXN];//depth of the node
int faz[MAXN];//father of the node
int tid[MAXN];//ID -> DFSID
int rnk[MAXN];//DFSID -> ID
int sum[MAXN<<2]
void dfs1(int u, int father, int depth) {/** u: 当前结点* father: 父亲结点* depth: 深度*/// 更新dep、faz、siz数组dep[u] = depth;faz[u] = father;siz[u] = 1;
​// 遍历所有和当前结点连接的结点for (int i = head[u]; i; i = edg[i].next) {int v = edg[i].to;// 如果连接的结点是当前结点的父亲结点,则不处理if (v != faz[u]) {dfs1(v, u, depth + 1);// 收敛的时候将当前结点的siz加上子结点的sizsiz[u] += siz[v];// 如果没有设置过重结点son或者子结点v的siz大于之前记录的重结点son,则进行更新if (son[u] == -1 || siz[v] > siz[son[u]]) {son[u] = v;}}}
}void dfs2(int u, int t) {/*** u:当前结点* t:起始的重结点*/top[u] = t;  // 设置当前结点的起点为ttid[u] = cnt;  // 设置当前结点的dfs执行序号rnk[cnt] = u;  // 设置dfs序号对应成当前结点cnt++;
​// 如果当前结点没有处在重链上,则不处理if (son[u] == -1) {return;}// 将这条重链上的所有的结点都设置成起始的重结点
    dfs2(son[u], t);// 遍历所有和当前结点连接的结点for (int i = head[u]; i; i = edg[i].next) {int v = edg[i].to;// 如果连接结点不是当前结点的重子结点并且也不是u的父亲结点,则将其的top设置成自己,进一步递归if (v != son[u] && v != faz[u]){dfs2(v, v);}}
}void pushup(int rt){sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}void update(int p,int c,int l,int r,int rt){if(l == r){sum[rt] += c;return ;}mid;if(p <= m) update(p,c,lson);else update(p,c,rson);pushup(rt);
}ll query(int L,int R,int l,int r,int rt){if(L <= l&&R >= r) return sum[rt];mid;ll ret = 0;if(L <= m) ret += query(L,R,lson);if(R > m) ret += query(L,R,rson);return ret;
}ll ask(int x,int y){   //求两结点路径上的权值和int fx = top[x],fy = top[y];ll ans = 0;while(fx != fy){if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);ans += query(tid[fx],tid[x],1,n,1);x = fa[fx]; fx = top[x];}ans += (dep[x] > dep[y])?query(tid[y],tid[x],1,n,1):query(tid[x],tid[y],1,n,1);return ans;
}

转载于:https://www.cnblogs.com/kls123/p/8858155.html

树链剖分+线段树 单点修改 区间求和 模板相关推荐

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1153  Solved: 421 [Submit][Sta ...

  2. P2486 [SDOI2011]染色(树链剖分+线段树)

    题干描述 输入描述 输出格式 对于每个询问操作,输出一行答案. 输入输出样例 输入 #1 复制 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C 2 1 1 Q ...

  3. BZOJ4127Abs——树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  4. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  5. BZOJ3862Little Devil I——树链剖分+线段树

    题目大意: 给一棵树,每条边可能是黑色或白色(起始都是白色),有三种操作: 1.将u到v路径上所有边颜色翻转(黑->白,白->黑) 2.将只有一个点在u到v路径上的边颜色翻转 3.查询u到 ...

  6. CodeForces - 160D Edges in MST(思维+tarjan/树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一张 n 个点 m 条边组成的带权无向图,现在对于每条边来说,确定一下其分类: 一定是最小生成树上的边 可能是最小生成树上的边 一定不是最小生成树的边 题目分析:两种 ...

  7. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  8. CodeForces - 609E Minimum spanning tree for each edge(最小生成树+树链剖分+线段树/树上倍增)

    题目链接:点击查看 题目大意:给出一张 n 个点和 m 条边组成的无向图,现在询问包含每一条边的最小生成树 题目分析:考虑求解次小生成树的思路: 求出最小生成树 ans 枚举每一条非树边 ( u , ...

  9. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  10. YbtOJ-染色计划【树链剖分,线段树,tarjan】

    正题 题目大意 给出nnn个点的一棵树,每个点有个颜色aia_iai​,你每次可以选择一个颜色全部变成另一个颜色. 求最少多少次操作可以把一种颜色变成一个完整的连通块. 1≤k≤n≤2×1051\le ...

最新文章

  1. 开发脚本自动部署及监控
  2. 给 Easyui Datagrid 扩展方法
  3. layui 下拉框空选项不显示_layui下select下拉框不显示或没有效果
  4. 完全弄懂C++中的构造与析构函数
  5. MySQL笔记-ibd文件格式初步分析(仅数据块笔记)
  6. Android Studio(4)---开发人员工作流程基础
  7. 树莓派python gpio 模仿iic_树莓派高级GPIO库,wiringpi2 for python使用笔记(五)i2c读取测试...
  8. MATLAB代码:计及碳排放交易及多种需求响应的微网/虚拟电厂日前优化调度
  9. 身份证前6位编码与地址对应关系表
  10. 执行以下代码后,可以看到小猫在舞台上右转了4次正好一圈。
  11. apr_thread使用内存之谜
  12. 程序员如何写好设计方案
  13. matlab 自动对焦,一种基于双摄像头的自动对焦方法与流程
  14. Oracle树形结构拖拽之插队重新排序
  15. 基于Uniapp实现的Android的校园二手商品交易平台App源码
  16. RGB与YUV格式详解
  17. 数商云B2B分销商城系统:助力企业加快分销速度,构建高效智能B2B网上分销平台
  18. 著作权法_信息网络传播权保护条例_最高人民法院关于审理侵害信息网络传播权民事纠纷案件适用法律若干问题的规定
  19. 5.0 DataView使用说明
  20. 《大明王朝》以牺牲换来大义

热门文章

  1. java取两个10_30的随机整数_产生10个[30,90]区间上的随机整数,然后对其用选择法...
  2. php临时目录没有文件夹里,PHP上传 找不到临时文件夹的解决方法
  3. 动画专业艺术里最懂计算机的,美国数字媒体艺术专业了解一下!
  4. 如何在linux程序中捕获异常信号
  5. Python高级特性:迭代器和生成器
  6. 【IT笔试面试题整理】数组中出现次数超过一半的数字
  7. How to custom RedHat DVD
  8. opencv_python关于Qt的错误
  9. 发生地震等灾难,死难者的存款会怎么处理?
  10. 认识FPGA触发器的亚稳态