[左偏树]CODE[VS] 1063——合并果子
2017-07-25 11:33
351 查看
Ps:博主又来水blog辣
二叉哈夫曼树。
今天复习堆QuQ,额、
于是很想码左偏树,发现竟然没有水左偏树的blog,所以来一发不要建议。
看到CODE[VS]有道合并果子++,数据大了100倍,那只能用单调序列了。
题目梗概
不需要了吧。二叉哈夫曼树。
解题思路
直接上代码今天复习堆QuQ,额、
于是很想码左偏树,发现竟然没有水左偏树的blog,所以来一发不要建议。
看到CODE[VS]有道合并果子++,数据大了100倍,那只能用单调序列了。
#include<cstdio> #include<algorithm> using namespace std; const int maxn=20005; struct jz{ int x,s,l,r; }a[maxn]; inline int _read(){ int num=0;char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') num=num*10+ch-48,ch=getchar(); return num; } int n,ro,til,ans; int merge(int x,int y){ if (x==0||y==0) return x|y; if (a[x].x>a[y].x) swap(x,y); a[x].r=merge(a[x].r,y); if (a[a[x].l].s<a[a[x].r].s) swap(a[x].l,a[x].r); a[x].s=a[a[x].l].s+a[a[x].r].s+1; return x; } void put(int x){ a[++til].x=x;a[til].s=1; a[til].l=a[til].r=0; ro=merge(ro,til); } int get(){ int x=ro; ro=merge(a[x].l,a[x].r); return a[x].x; } int main(){ n=_read(); for (int i=1;i<=n;i++) put(_read()); for (int i=1;i<n;i++){ int x=get(),y=get(); ans+=x+y;put(x+y); } printf("%d\n",ans); return 0; }
相关文章推荐
- 【基础练习】【堆】codevs1063 合并果子题解
- [Codevs] 1063 合并果子
- codevs1063 合并果子 优先队列(小根堆)
- 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆
- codevs 1063 合并果子 STL 优先队列
- 合并果子 (codevs 1063) 题解
- codevs1063 luogu1090 合并果子
- CODEVS 1063合并果子
- codevs1063 luogu1090 合并果子
- Codevs 1063 合并果子
- 【codevs1063】【NOIP2004PJ】合并果子,贪心の钻石
- 【贪心】CODE[VS] 1063 NOIP2004普及组-合并果子 (刷题记录(模拟+优先队列))
- codevs1063合并果子
- [解法二] CodeVS1063 合并果子 题解
- Codevs1063 合并果子(2004年NOIP全国联赛普及组)
- 【codevs】 1766 装果子 二分
- 1063 合并果子 优先队列
- [CodeVs 1063] 合并果子 ——小根堆
- 1063 合并果子
- codevs2298 石子合并(直线形