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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[BZOJ3653][长链剖分]谈笑风生

發布時間:2023/12/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ3653][长链剖分]谈笑风生 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

BZOJ3653

我也不知道題面的引申意義

發現可以求出以每個點為p時的ans,討論一下祖先和子孫的貢獻,用長鏈剖分維護就好了

Code:

#include<bits/stdc++.h> #define ll long long using namespace std; inline int read(){int res=0,f=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}return res*f; } const int N=3e5+5; int vis[N<<1],nxt[N<<1],head[N<<1],tot=0; int val[N],pt[N],fa[N],lson[N],top[N],md[N],dep[N],siz[N]; ll tmp[N],*f[N],*id=tmp,ans[N]; struct Q{int num,k;}; vector<Q>q[N]; inline void add(int x,int y){vis[++tot]=y;nxt[tot]=head[x];head[x]=tot;} void dfs(int v){pt[v]=siz[v]=1;for(int i=head[v];i;i=nxt[i]){int y=vis[i];if(pt[y]) continue;fa[y]=v;md[y]=dep[y]=dep[v]+1;dfs(y);siz[v]+=siz[y];if(md[y]>md[lson[v]]) lson[v]=y;}if(lson[v]) md[v]=md[lson[v]]; } void dp(int v){f[v][0]=siz[v]-1;if(lson[v]) f[lson[v]]=f[v]+1,dp(lson[v]),f[v][0]+=f[lson[v]][0];for(int i=head[v];i;i=nxt[i]){int y=vis[i];if(y==fa[v] || y==lson[v]) continue;f[y]=id;id+=md[y]-dep[y]+1;dp(y);for(int j=0;j<=md[y]-dep[y];j++) f[v][j+1]+=f[y][j];f[v][0]+=f[y][0];}for(int i=q[v].size()-1;~i;i--){int k=q[v][i].k,num=q[v][i].num;ans[num]+=1ll*(siz[v]-1)*min(dep[v]-1,k);if(k>=md[v]-dep[v]) ans[num]+=f[v][0]-siz[v]+1;else ans[num]+=f[v][0]-siz[v]+1-f[v][k+1];}return; } int n,m; int main(){n=read(),m=read();for(int x,y,i=1;i<n;i++){x=read(),y=read();add(x,y);add(y,x);}dep[1]=1;dfs(1);for(int i=1;i<=m;i++) {int u=read();Q t;t.k=read();t.num=i;q[u].push_back(t);}f[1]=id;id+=md[1];dp(1);for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";return 0; }

總結

以上是生活随笔為你收集整理的[BZOJ3653][长链剖分]谈笑风生的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。