日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

發(fā)布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點權(quán)樹的模板題,另外發(fā)現(xiàn)樹狀數(shù)組也是可以區(qū)間更新的。。

注意在對鏈進行操作時方向不要搞錯

線段樹版本

#include<bits/stdc++.h> using namespace std; #define maxn 50005 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 struct Edge{int to,next;}edge[maxn<<2]; int a[maxn],head[maxn],tot; int deep[maxn],fa[maxn],son[maxn],num[maxn]; int top[maxn],fp[maxn],p[maxn],pos; inline void addedge(int u,int v){edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++;} void dfs1(int u,int pre,int dep){fa[u]=pre;deep[u]=dep;num[u]=1;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v==pre) continue;dfs1(v,u,dep+1);num[u]+=num[v];if(son[u]==-1 || num[son[u]]<num[v]) son[u]=v;} } void getpos(int u,int sp){top[u]=sp;p[u]=pos++;fp[p[u]]=u;if(son[u]==-1) return;getpos(son[u],sp);for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v!=fa[u] && v!=son[u]) getpos(v,v);} }int seg[maxn<<2]; void build(int l,int r,int rt){seg[rt]=0;if(l==r) {seg[rt]=a[fp[l]];return;}//注意這里,線段樹上坐標為i的點權(quán)值是第i個被訪問到的點的權(quán)值 int m=l+r>>1;build(lson);build(rson); } inline void pushdown(int rt){if(seg[rt]) {seg[rt<<1]+=seg[rt];seg[rt<<1|1]+=seg[rt];seg[rt]=0;} } void update(int L,int R,int c,int l,int r,int rt){if(L<=l && R>=r){seg[rt]+=c;return;}pushdown(rt);int m=l+r>>1;if(L<=m) update(L,R,c,lson);if(R>m) update(L,R,c,rson); } int query(int pos,int l,int r,int rt){if(l==r) return seg[rt];pushdown(rt);int m=l+r>>1;if(pos<=m) return query(pos,lson);else return query(pos,rson); } void change(int u,int v,int c){int f1=top[u],f2=top[v];while(f1!=f2){if(deep[f1]<deep[f2]){swap(u,v);swap(f1,f2);}update(p[f1],p[u],c,1,pos,1);u=fa[f1];f1=top[u];}if(deep[u]>deep[v]) swap(u,v);update(p[u],p[v],c,1,pos,1); } void init(){tot=pos=0;pos=1;memset(head,-1,sizeof head);memset(son,-1,sizeof son); } int main(){int n,m,q,u,v,k;while(scanf("%d%d%d",&n,&m,&q)==3){init();for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);addedge(u,v);addedge(v,u);}dfs1(1,0,0);getpos(1,1);build(1,pos,1);char op[2];while(q--){scanf("%s",op);if(op[0]=='I') {scanf("%d%d%d",&u,&v,&k);change(u,v,k);}else if(op[0]=='D'){scanf("%d%d%d",&u,&v,&k);change(u,v,-k);}else {scanf("%d",&u);printf("%d\n",query(p[u],1,pos,1));}} } }

樹狀數(shù)組版本。。果然還是樹狀數(shù)組快一點啊

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define MAXN 50010 using namespace std; struct Edge{int to, next; }edge[MAXN*2]; int head[MAXN], tot; int deep[MAXN]; int fa[MAXN]; int son[MAXN]; int p[MAXN]; int fp[MAXN]; int top[MAXN]; int num[MAXN]; int pos; int c[MAXN], n;//樹狀數(shù)組的 void init() {tot=0;memset(head,-1,sizeof(head));pos=1;//樹狀數(shù)組,編號從1開始 memset(son,-1,sizeof(son));memset(c,0,sizeof(c)); } void addedge(int u,int v) {edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++; } void dfs1(int u, int pre, int d){deep[u] = d;fa[u] = pre;num[u] = 0;for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if (v != pre){//v不能是父節(jié)點 dfs1(v, u, d+1);num[u] += num[v];if (son[u]==-1||num[v]>num[son[u]])son[u] = v;}} } void getpos(int u, int sp){top[u] = sp;p[u] = pos++;fp[p[u]] = u;if (son[u] == -1)return;getpos(son[u], sp);for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if (v != fa[u] && v != son[u])getpos(v, v);} } //樹狀數(shù)組 int lowbit(int i){return i&(-i); } int sum(int i){int s = 0;while(i<=n){s += c[i];i +=lowbit(i);}return s; } void add(int i, int val){while(i>0){c[i]+=val;i-=lowbit(i);} } void change(int u, int v, int val){int f1 = top[u], f2 = top[v];while(f1 != f2){if (deep[f1]<deep[f2]){swap(f1, f2);swap(u, v);}add(p[u], val);//樹狀數(shù)組的區(qū)間更新原理 add(p[f1]-1, -val);//這兒得減去一個東西 u = fa[f1];f1 = top[u];}if(deep[u]>deep[v])swap(u,v);//默認u是v的祖先 add(p[u]-1, -val);add(p[v], val); } int a[MAXN]; int main(){int M, P;while(~scanf("%d%d%d", &n, &M, &P)){int u, v;int C1, C2, K;char op[2];init();for(int i = 1; i<=n; i++)scanf("%d", &a[i]);while(M--){scanf("%d%d", &u, &v);addedge(u, v);addedge(v, u);}dfs1(1, 0, 0);getpos(1, 1);while(P--){scanf("%s", op);if (op[0]=='Q'){scanf("%d", &u);printf("%d\n", sum(p[u])+a[u]);}else {scanf("%d%d%d", &C1, &C2, &K);if (op[0]=='D')K = -K;change(C1, C2, K);}}} }

?

轉(zhuǎn)載于:https://www.cnblogs.com/zsben991126/p/10040378.html

總結(jié)

以上是生活随笔為你收集整理的hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 告诉我真相俄剧在线观看 | 小草av在线 | www.88av| 日韩一区欧美一区 | 97精品一区二区视频在线观看 | 国产欧美日韩 | 淫五月 | 国产手机精品视频 | 青青草精品在线 | 经典三级久久 | 神马影院一区二区 | 天天干夜夜操视频 | 欧美在线aa | 理论片第一页 | 亚洲乱妇 | 国产精品19乱码一区二区三区 | 在线免费国产视频 | 美女张开腿让男人桶爽 | 91成人看| 国产夫妻精品 | 美女网站在线看 | 91精品国产乱码久久 | www亚洲视频 | 欧美123区| 日韩激情电影在线 | 樱空桃在线 | 99热18| www.白丝| 欧美日韩成人一区二区 | 91婷婷在线 | 四虎影库永久在线 | 久久一级电影 | 污污在线看 | 成人做爰的视频 | 久久精品国产亚洲av麻豆 | 一区二区三区久久久 | 捅肌肌| 中文在线a√在线8 | 免费成人美女女电影 | 亚欧洲精品在线视频 | 国产黄色精品 | 美女搡bbb又爽又猛又黄www | av片子在线观看 | 日本伦理在线 | 美女被草出白浆 | 91久久国产综合久久91 | 一级做a爰片毛片 | 国产又粗又大又硬 | 动漫av网站| 国产精品操 | 欧美综合一区 | 午夜免费大片 | 国产精品三级av | 黄色免费网站在线 | 国产精品国产三级国产在线观看 | 四虎永久免费在线观看 | 一区二区三区中文视频 | 亚洲一区二区三区精品视频 | 国产成人无码精品久久久久 | 中国一级大黄大黄大色毛片 | 亚洲精品www久久久 一级aaa毛片 | 国产精品aⅴ | 国产一道本 | 男人的天堂色 | 最新国产精品 | 亚洲精品av在线 | 91欧美成人 | av大西瓜| 女王人厕视频2ⅴk | 少妇性l交大片免费观看 | 欧洲在线观看 | av一区二区三区在线观看 | 青草综合 | 91在线视频免费观看 | 欧美国产日韩在线观看成人 | 九九av在线 | 国产视频手机在线观看 | 美女扒开内看个够网站 | 国产视频手机在线播放 | 午夜影院在线看 | 一本色道久久亚洲综合精品蜜桃 | 亚洲黄色片子 | 岛国视频一区 | 日韩一级片av | 少妇福利在线 | 亚洲一区有码 | xxxwww黄色 | 久久综合久久久 | 韩国三级bd高清中字2021 | 国产片高清在线观看 | 午夜激情电影在线观看 | 免费在线黄网站 | 国产精品久久久久久久久久久久久久 | 91看片视频| 动漫av在线| 婷婷色激情 | 久久国产精品波多野结衣 | 人妻夜夜爽天天爽三区麻豆av网站 | 黄色成人免费视频 |