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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round #425 D

發(fā)布時(shí)間:2024/10/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #425 D 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Misha, Grisha and Underground

題意:給一顆樹(shù),每個(gè)點(diǎn)權(quán)值為1,q個(gè)詢問(wèn),每個(gè)詢問(wèn)給出a,b,c,3 個(gè)點(diǎn),選擇一個(gè)點(diǎn)為起點(diǎn),一個(gè)點(diǎn)為終點(diǎn),形成一條路徑,第3個(gè)點(diǎn)做為第二條路徑的起點(diǎn),問(wèn)2條路徑上重復(fù)區(qū)間的點(diǎn)權(quán)和的最大值

思路:樹(shù)鏈剖分或者LCA,樹(shù)鏈剖分映射到數(shù)狀數(shù)組上,沒(méi)有更新,求出ab ac bc之間的權(quán)值和,最長(zhǎng)的路徑和第二長(zhǎng)的路徑重復(fù)的部分就是答案

AC代碼:

#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #define mem(a) memset(a,0,sizeof(a)) #define mp(x,y) make_pair(x,y) #define pb(x) push_back(x) #define lrt (root*2) #define rrt (root*2+1) #define len (r-l+1) #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const long long INF = 1e18+1LL; const int inf = 1e9+1e8; const int N=1e5+100; const ll mod=1e9+7;struct Edge{int next,to; }; Edge e[N<<1]; int n,q; int siz[N],son[N],tip[N],fa[N],dep[N],ran[N],top[N],cnt; int head[N],tot; int C[N]; void add(int u, int v){e[tot].to=v;e[tot].next=head[u];head[u]=tot++; } void dfs1(int u, int f){siz[u]=1;fa[u]=f;dep[u]=dep[f]+1;for(int i=head[u]; i!=-1; i=e[i].next){int v=e[i].to;if(v==f) continue;dfs1(v,u);siz[u]+=siz[v];if(siz[v]>siz[son[u]]) son[u]=v;} } void dfs2(int u, int tp){tip[u]=++cnt;top[u]=tp;if(son[u]) dfs2(son[u], tp);for(int i=head[u]; i!=-1; i=e[i].next){int v=e[i].to;if(v!=son[u] && v!=fa[u]) dfs2(v,v);} } int lowbit(int x){return (-x)&x; } void add(int x){while(x<=n){C[x]+=1;x+=lowbit(x);} } int sum(int l, int r){int ret=0;l--;while(r>0){ret+=C[r];r-=lowbit(r);}while(l>0){ret-=C[l];l-=lowbit(l);}return ret; } int query(int u, int v){int ans=0;while(top[u]!=top[v]){if(dep[top[u]] < dep[top[v]]) swap(u,v);ans+=sum(tip[top[u]], tip[u]);u=fa[top[u]];}if(dep[u] > dep[v]) swap(u,v);ans+=sum(tip[u], tip[v]);return ans; } int main(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>q;memset(head,-1,sizeof(head));int to;for(int i=2; i<=n; ++i){cin>>to;add(i,to);add(to,i);}for(int i=1; i<=n; ++i){add(i);}dfs1(1,1);dfs2(1,1);int a,b,c,ans[5],anss;while(q--){cin>>a>>b>>c;ans[0]=query(a,b);ans[1]=query(a,c);ans[2]=query(b,c);sort(ans,ans+3);anss=ans[1]+ans[2]+1-ans[0]>>1;cout<<anss<<"\n";}return 0; }

?

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

總結(jié)

以上是生活随笔為你收集整理的Codeforces Round #425 D的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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