• 帝都Day4(3)——还是数据结构


    可并堆

    左偏树中

    dist[x]=dist[rs[x]]+1

    合并的时候,把权志较大的根作为根节点,把这棵树右子树和另一棵树合并。

    说明白点:(上图描述有点问题)

    设x表示根权值较大的左偏树,y表示根权值较小的左偏树,合并的时候把x的根节点当做新的树的根节点,把x左子树当做新的左子树,x的右子树和y合并的树作为新的右子树。最后比较dist,如果新的树的左子树的dist小于右子树的,交换。

    int merge(int x,int y)//x y是要合并的左偏树的两个根 返回值是新树的根
    {
        if(!x||!y)return x|y;//一个数|0还是那个数,判断空树
        if(v[x]<v[y])swap(x,y);//x是权值大的 y小
        rs[x]=merge(rs[x],y);//新的右子树是原来的右子树和y的合并树
        if(dist[rs[x]]>dist[ls[x]])swap(rs[x],ls[x]);//根据dist调整
        dist[x]=dist[rs[x]]+1;//更新x的dist的值
        return x;
    }
    

    还有...add del

    int add(int x)
    {
        v[++cnt]=x;//先建一个只有一个节点的树
        dist[cnt]=0;
        root=merge(cnt,root);//然后把这个数合并
    }
    int del()//删除根节点(不要删除内部节点= =)
    {
        root=merge(ls[root],rs[root]);
        //合并一个节点的左儿子和右儿子,就是删除这个点啦...
    }
    

     操作的时间复杂度都为O(log2n)

    例题:hdu1512——猴子打架

    某dalao的思路:

    我写的“代码”(可能出问题)

    void 打架(int x,int y)
    {
        删除x;删除y;
        x.权值/=2;y.权值/=2;
        加入(x原来的树,x);加入(y原来的树,y);
        合并(x的树,y的树);
        printf("%d
    ",新树.root);
    }
    

     APIO2012 Dispatching【洛谷难度省选/NOI-】

    http://www.lydsy.com/JudgeOnline/problem.php?id=2809

    https://www.luogu.org/problem/show?pid=1552

    void dfs(int x)
    {
        sum[x]=v[x];//sum表示可并堆所有元素权值和,一开始只有自己(开销,一开始是自己的开销)
        root[x]=x;//左偏树根先是自己(一开始只有自己)
    //dist=0
        num[x]=1;//元素数量,一开始没搜只有这个节点1个(忍者数量)
        for(i=x的儿子)//处理儿子
        {
            dfs(i);
            root[x]=merge(root[i],root[x]);//慢慢地建堆(慢慢地拉人入坑)
            sum[x]+=sum[i];//sum是整个左偏树的权值和(总开销)
            num[x]+=num[i];//num是整个左偏树元素数量(忍者数量)
        }
        for(;sum[x]>m;)//处理当前节点,让总权值(总开销)不超过m
        {
            sum[x]-=v[root[x]];//依次删掉最大的元素,贪心尽可能快降低总权值(减少开销)
            root[x]=merge(ls[root[x]],rs[root[x]]);//删掉权值最大的点(左子树并右子树)
            num[x]--;//可并堆元素数量减少1,(删了一个元素)
        }
        ans=max(ans,num[x]*L[x]);//取最大值(元素数量乘以领导能力(忍者数量乘以领导能力))
    }
  • 相关阅读:
    二叉排序树
    索引顺序表查找(分块查找)
    wpf中的窗口
    递归算法以及汉诺塔
    Net中资源存储的设置
    AutoResetEvent 和ManualResetEvent
    WPF:跨应用程序会话保持和还原应用程序范围的属性
    Base64编码及其作用
    WPF中的应用程序级别Application
    Ajax经典学习教材,IBM官方Ajax教材
  • 原文地址:https://www.cnblogs.com/oier/p/7202419.html
Copyright © 2020-2023  润新知