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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

發(fā)布時間:2024/4/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

P3521 [POI2011]ROT-Tree Rotations

題意:遞歸給出給一棵\(n(1≤n≤200000)\)個葉子的二叉樹,可以交換每個點的左右子樹,要求前序遍歷葉子的逆序對最少。

大體給出方式:
第一行一個正整數(shù)\(n\),表示該二叉樹的葉節(jié)點的個數(shù);

下面若干行,每行一個數(shù)\(p\)

如果\(p=0\),表示這個節(jié)點不是葉節(jié)點,遞歸地向下讀入其左孩子和右孩子的信息;

如果\(p \neq 0\) ,表示這個節(jié)點是葉節(jié)點,權值為\(p\)


本來想學一下啟發(fā)式合并的,結果被一個很神奇的錯誤卡了很久。。

啟發(fā)式合并的復雜度沒怎么學會,只是大致知道權值線段樹的合并和相同的節(jié)點數(shù)量成正相關,反正把只有一條鏈的權值線段樹都合起來的復雜度是\(O(nlogn)\)

不過在最后出現(xiàn)了一個神奇的錯誤

10分:

int dfs() {scanf("%d",&k);if(k) return build(1,n,k);s1=s2=0;int now=Merge(dfs(),dfs());ans+=min(s1,s2);return now; }

100分:

int dfs() {scanf("%d",&k);if(k) return build(1,n,k);int now=Merge(dfs(),dfs());ans+=min(s1,s2);s1=s2=0;return now; }

注意遞歸時賦初值該在什么時候搞


Code:

#include <cstdio> #define ll long long #define ls ch[now][0] #define rs ch[now][1] const int N=200000; ll min(ll x,ll y){return x<y?x:y;} int ch[N*25][2],n,k,tot; ll sum[N*25],ans,s1,s2; int build(int l,int r,int pos) {int now=++tot;sum[now]++;if(l==r) return now;int mid=l+r>>1;if(pos<=mid)ls=build(l,mid,pos);elsers=build(mid+1,r,pos);return now; } int Merge(int x,int y) {if(!x||!y) return x+y;sum[x]+=sum[y];s1+=sum[ch[x][1]]*sum[ch[y][0]];s2+=sum[ch[x][0]]*sum[ch[y][1]];ch[x][0]=Merge(ch[x][0],ch[y][0]);ch[x][1]=Merge(ch[x][1],ch[y][1]);return x; } int dfs() {scanf("%d",&k);if(k) return build(1,n,k);int now=Merge(dfs(),dfs());ans+=min(s1,s2);s1=s2=0;return now; } int main() {scanf("%d",&n);dfs();printf("%lld\n",ans);return 0; }

2018.7.30

轉載于:https://www.cnblogs.com/butterflydew/p/9392041.html

總結

以上是生活随笔為你收集整理的洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

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