Codeforces Round #425 D
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #425 D
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Misha, Grisha and Underground
題意:給一顆樹,每個點權值為1,q個詢問,每個詢問給出a,b,c,3 個點,選擇一個點為起點,一個點為終點,形成一條路徑,第3個點做為第二條路徑的起點,問2條路徑上重復區間的點權和的最大值
思路:樹鏈剖分或者LCA,樹鏈剖分映射到數狀數組上,沒有更新,求出ab ac bc之間的權值和,最長的路徑和第二長的路徑重復的部分就是答案
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; }?
轉載于:https://www.cnblogs.com/max88888888/p/7241773.html
總結
以上是生活随笔為你收集整理的Codeforces Round #425 D的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dp入门 专题记录 2017-7-26
- 下一篇: 建设银行转账多久能到账 一般不超过2小时