博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树上和图上算法合集
阅读量:4948 次
发布时间:2019-06-11

本文共 2723 字,大约阅读时间需要 9 分钟。

1、树链剖分

树链剖分模板

#include
#define ll long long#define INF 2147483647#define mem(i,j) memset(i,j,sizeof(i))#define F(i,j,n) for(register int i=j;i<=n;i++)#define md pusing namespace std;struct hahaha{ int from,to,nxt;}s[200010];int n,m,r,p,head[200010],cnt=0,pls[1000010];int v[100010],f[100010],son[100010];int dep[100010],top[100010],sz[100010];int id[1000010],vt[1000010],num=0;inline int read(){ int datta=0;char chchc=getchar();bool okoko=0; while(chchc<'0'||chchc>'9'){if(chchc=='-')okoko=1;chchc=getchar();} while(chchc>='0'&&chchc<='9'){datta=datta*10+chchc-'0';chchc=getchar();} if(okoko==1)return -datta; return datta;}inline void ins(int from,int to){ s[++cnt].from=from; s[cnt].to=to; s[cnt].nxt=head[from]; head[from]=cnt;}inline int dfs1(int from){ int tmp=0,tmx=0,ti=0; for(int i=head[from];i;i=s[i].nxt){ int to=s[i].to; if(to!=f[from]){ dep[to]=dep[from]+1; f[to]=from; tmp=dfs1(to); sz[from]+=tmp; if(tmp>tmx) tmx=tmp,ti=to; } } sz[from]++; son[from]=ti; return sz[from];}inline void dfs2(int from,int tp){ id[from]=++num,vt[num]=v[from]; if(son[from]) top[son[from]]=tp,dfs2(son[from],tp); for(int i=head[from];i;i=s[i].nxt){ int to=s[i].to; if(to!=f[from]&&to!=son[from]) top[to]=to,dfs2(to,to); }}struct Segment_Tree{ #define ls u<<1 #define rs u<<1|1 #define mid ((l+r)>>1) int tree[1000010]; void updata(int u){ tree[u]=(tree[ls]+tree[rs])%md; } void pushdown(int u,int l,int r){ if(!pls[u]) return ; pls[ls]+=pls[u]; pls[rs]+=pls[u]; tree[ls]+=(mid-l+1)*(pls[u]); tree[rs]+=(r-mid)*(pls[u]); pls[u]=0; } void build_tree(int u,int l,int r){ if(l==r){ tree[u]=vt[l]; return ; } build_tree(ls,l,mid); build_tree(rs,mid+1,r); updata(u); } void change(int u,int l,int r,int x,int y,int z){ if(x<=l&&r<=y){ pls[u]+=z; tree[u]+=(r-l+1)*z; return ; } pushdown(u,l,r); if(x<=mid) change(ls,l,mid,x,y,z); if(y>=mid+1) change(rs,mid+1,r,x,y,z); updata(u); } int ask(int u,int l,int r,int x,int y){ int res=0; if(x<=l&&r<=y) return tree[u]; pushdown(u,l,r);; if(x<=mid) res+=ask(ls,l,mid,x,y); if(y>=mid+1) res+=ask(rs,mid+1,r,x,y); return res; }}T;inline void cRange(int x,int y,int z){ while(top[x]!=top[y]){ if(dep[top[x]]

转载于:https://www.cnblogs.com/hzf29721/p/10179341.html

你可能感兴趣的文章
NSURL 处理的基本函数
查看>>
IOS开发之Cocoa编程—— NSUndoManager
查看>>
17.蛇形矩阵(模拟)
查看>>
Javascript 第一天
查看>>
[BZOJ 1002] [FJOI 2007] 轮状病毒
查看>>
linux 打造man中文帮助手册
查看>>
02-body标签中相关标签
查看>>
Hibernate集合的映射
查看>>
转 VS2010 RDLC 横向合并时“未正确设置 tablix“Tablix1”的 FixedData 属性”错误解决方法 ....
查看>>
[转] 一些关于http的get post的概念.
查看>>
nsclient使用nrpe的方法 + windows检测udp端口的bat脚本
查看>>
如何使样式CSS不被覆盖 !important
查看>>
mongodb-3
查看>>
PHP常用正则表达式汇总
查看>>
网站指纹识别工具——WhatWeb v0.4.7发布
查看>>
https加固,https://ip暴露后端IP。
查看>>
java学习之第五章编程题示例(初学篇)
查看>>
uva-----11292 The Dragon of Loowater
查看>>
PIL中的Image和numpy中的数组array相互转换
查看>>
java 转载
查看>>