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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces 766E

發布時間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 766E 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給一棵樹(1e5),每個節點上有對應權值(0<=ai<=1e6)定義樹上兩個節點間的距離為路徑中節點的異或,求所有節點對間的距離和(包括節點自身也作為節點對,距離為節點權值)。

解題思路:

  做了771C后這道題就有感覺了。關鍵在于將每個權值的二進制位拆開計算,以dp[u][i][0]和dp[u][i][1]記錄到達節點u的子樹上的節點的距離的第 i 位為0和1的個數有多少,維護計算就可以了。比較僵的是開始寫的時候沒有考慮單獨一個節點作為一個節點對,所以在每個遞歸的最后面單獨加上到全局變量res中。

  每一個遞歸的最開始,用局部變量num數組記錄u的權值的二進制形式,同時初始化dp[u]數組。對每個子節點的遍歷轉移:

  先遞歸子節點,返回后則已計算完畢。則有如果u的第 i 位為1,dp[u][i][1]+=dp[v][i][0], dp[u][i][0]+=dp[v][i][1]; 否則dp[u][i][1]+=dp[v][i][1], dp[u][i][0]+=dp[v][i][0]; 這里應該不難理解。

  至于統計答案,只計算為1的即可,即int cnt1=dp[u][i][1]*dp[v][i][0]+dp[u][i][0]*dp[v][i][1]; res+=1LL*cnt1*(1<<i);?

  見代碼:(轉移其實比771C好寫一點感覺)

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; #define sqr(x) ((x)*(x)) const int N=1e5+10,M=21; int head[N],nxt[N<<1],to[N<<1],cnt; int n,a[N],dp[N][M][2]; ll res; void init(){memset(head,-1,sizeof(head));res=cnt=0; } void addEdge(int u,int v){nxt[cnt]=head[u];to[cnt]=v;head[u]=cnt++; } void dfs(int u,int pre){int num[M];for(int i=0;i<M;i++){if(a[u]&(1<<i)) num[i]=1,dp[u][i][1]=1,dp[u][i][0]=0;else num[i]=0,dp[u][i][1]=0,dp[u][i][0]=1;}for(int e=head[u];~e;e=nxt[e]){int v=to[e];if(v==pre) continue;dfs(v,u); for(int i=0;i<M;i++){int cnt1=dp[u][i][1]*dp[v][i][0]+dp[u][i][0]*dp[v][i][1];res+=1LL*cnt1*(1<<i);if(num[i]){dp[u][i][1]+=dp[v][i][0];dp[u][i][0]+=dp[v][i][1];}else{dp[u][i][1]+=dp[v][i][1];dp[u][i][0]+=dp[v][i][0];}}}res+=a[u]; } int main(){//freopen("in.txt","r",stdin);while(~scanf("%d",&n)){for(int i=1;i<=n;i++)scanf("%d",a+i);init();for(int i=1;i<n;i++){int u,v;scanf("%d%d",&u,&v);addEdge(u,v);addEdge(v,u);}dfs(1,0);printf("%I64d\n",res);}return 0; }

?

轉載于:https://www.cnblogs.com/names-yc/p/6605338.html

總結

以上是生活随笔為你收集整理的Codeforces 766E的全部內容,希望文章能夠幫你解決所遇到的問題。

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