当前位置: 首页 > news >正文

可并堆(左偏树)

算法理解

ybt上讲的挺清楚的。。。

T1:

注:看洛谷原题,其中父节点编号是小于该节点的,我们把该节点向父节点上合并,为什么这样做?因为树的深度不定dfs会爆栈

需要维护每个节点在左偏树上对应的根

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define ls(x) pq[x].ls
#define rs(x) pq[x].rs
#define key(x) pq[x].key
#define dist(x) pq[x].dist
using namespace std;
const int N=1e5+5;
struct prique{int ls,rs,key,dist;void init(int x){ls=rs=dist=0;key=x;}
}pq[N];
int merge(int A,int B){if(!A)  return B;if(!B)  return A;if(key(A)<key(B))  swap(A,B);//大根堆rs(A)=merge(rs(A),B);if(!ls(A)||dist(ls(A))<dist(rs(A)))  swap(ls(A),rs(A));if(rs(A))  dist(A)=dist(rs(A))+1;else  dist(A)=0;return A;
}
int n,m;
int cnt[N],c[N],rt[N],l[N],fa[N];
ll sum[N];
ll ans;
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int u;scanf("%d%d%d",&fa[i],&c[i],&l[i]);pq[i].init(c[i]);rt[i]=i;cnt[i]=1;sum[i]=c[i];}for(int i=n;i>=1;i--){ans=max(ans,(ll)cnt[rt[i]]*l[i]);//统计答案要每个点都统计到,不能放在结尾,因为cnt值会变int x=rt[i],y=rt[fa[i]];int cn=cnt[y];ll su=sum[y];cn+=cnt[x],su+=sum[x];y=merge(x,y);while(su>m){cn--;su-=c[y];y=merge(ls(y),rs(y));}rt[fa[i]]=y;cnt[y]=cn;sum[y]=su;}printf("%lld\n",ans);
}
http://www.sczhlp.com/news/790.html

相关文章:

  • 7-28
  • DAY24
  • 2025 ZR暑假集训 CD联考 Day2 E 环球旅行
  • zk后集训
  • 乘法逆元(部分施工)、exgcd
  • 夏令营Ⅲ期
  • centos8.2 挂载本地镜像作为yum源
  • 非常值得学习渲染入门的一个教程
  • HDU 多校 2025 R3
  • 7.28SAM后缀自动机,回文自动机
  • Linux开机自动登录的一种方法
  • day5
  • JAVA语言学习总结(第27天)
  • CVE-2021-45232 Apache APISIX Dashboard身份验证绕过漏洞 (复现)
  • IIS中配置HTTPS证书的详细步骤
  • Python入门学习(七)高级部分:正则表达式
  • 在运维工作中,如果运行的一个容器突然挂了,如何排查?
  • SciTech-EECS-Library: img2pdf 与 pdf2image : Python 的 pdf 与 image 双向转换库
  • 在运维工作中,docker封闭了哪些资源?
  • 深度学习(pytorch量化)
  • 在运维工作中,传统虚拟化与docker有什么区别?
  • 在运维工作中,Docker怎么清理容器磁盘空间?
  • 在运维工作中,Dockerfile中常见指令有哪些?
  • 英语_阅读_Rivers are important in culture_单词_待读
  • 题解:P12151 【MX-X11-T5】「蓬莱人形 Round 1」俄罗斯方块
  • 题解:P1291 [SHOI2002] 百事世界杯之旅
  • 题解:P4170 [CQOI2007] 涂色
  • 课堂分组赛、组队赛小结
  • 【AI News | 20250725】每日AI进展
  • 题解:P13308 故障