可并堆就可以,但是想复健一下主席树。

考虑枚举管理者,然后选忍者的时候在子树中贪心的从小到大选。做成dfs序就是选区间内和小于等于k的最多点。可以用主席树,查询的时候在主席树上二分即可

这里注意,为了方便起见,离散化的时候即使值相同也离散成不同值,这样可以保证主席树叶子结点的size最大为1,方便二分

#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
const int N=200005;
int n,m,h[N],cnt,a[N],dfn,rt[N],tot,g[N],l[N],r[N],ss,sk,mp[N];
long long c[N],d[N],ans;
struct qwe
{
int ne,to;
}e[N];
struct zxs
{
int l,r,ls,rs,s;
long long sum;
}t[3000005];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
inline bool cmp(const int &a,const int &b)
{
return c[a]<c[b];
}
inline void add(int u,int v)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
h[u]=cnt;
}
inline void dfs(int u)
{
a[++dfn]=u;
l[u]=dfn;
for(int i=h[u];i;i=e[i].ne)
dfs(e[i].to);
r[u]=dfn;
}
void build(int &ro,int l,int r)
{
ro=++tot;
t[ro].l=l,t[ro].r=r;
if(l==r)
return;
int mid=(l+r)>>1;
build(t[ro].ls,l,mid);
build(t[ro].rs,mid+1,r);
}
void ins(int &ro,int pr,int v,int w)
{
ro=++tot;
t[ro]=t[pr];
t[ro].s++;
t[ro].sum+=w;
if(t[ro].l==t[ro].r)
return;
int mid=(t[ro].l+t[ro].r)>>1;
if(v<=mid)
ins(t[ro].ls,t[pr].ls,v,w);
else
ins(t[ro].rs,t[pr].rs,v,w);
}
int ques(int l,int r,long long k)
{
if(t[l].l==t[l].r)
{
if(t[r].sum-t[l].sum!=0&&sk+t[r].sum-t[l].sum<=m)
return ss+1;
else
return ss;
}
long long now=t[t[r].ls].sum-t[t[l].ls].sum;
if(now>=k)
return ques(t[l].ls,t[r].ls,k);
else
{
ss+=t[t[r].ls].s-t[t[l].ls].s;
sk+=now;
return ques(t[l].rs,t[r].rs,k-now);
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
int b=read();g[i]=i,c[i]=read(),d[i]=read();
add(b,i);
}
sort(g+1,g+1+n,cmp);
for(int i=1;i<=n;i++)
mp[g[i]]=i;
dfs(1);
build(rt[0],1,n);
for(int i=1;i<=n;i++)
ins(rt[i],rt[i-1],mp[a[i]],c[a[i]]);
for(int i=1;i<=n;i++)
{
ss=0,sk=0;
ans=max(ans,d[i]*ques(rt[l[i]-1],rt[r[i]],m));
}
printf("%lld\n",ans);
return 0;
}

最新文章

  1. 风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,
  2. 练习题(登陆-进度条-微信接口判断qq-微信接口判断列车时刻表-)
  3. redis数据类型之—List
  4. ThreadPool原理介绍
  5. php - 执行Linux命令没有报错但也没有输出
  6. 【WPF】逻辑树和视觉树
  7. 具体解释http 协议
  8. NSOperation 的使用(下载相关) 图片和文件都是能够的 断点续传 图片逐渐显示
  9. 关于sqlserver还原不了数据库的原因
  10. Java 链接SQL Server 数据库
  11. CentOS7 nexus 3 搭建maven或gradle 私有代理服务器
  12. HDU 1022(火车过站 栈)
  13. [持续交付实践] pipeline使用:项目样例
  14. JDK8字符串拼接的正确姿势
  15. Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
  16. nodejs--get请求数据解析
  17. day 57 jQuery的补充
  18. python2.x下pip install mysql-python报错解决办法
  19. 你都掌握了吗?jQuery 选择器大全
  20. MVC实现多选下拉框

热门文章

  1. Flex设置PopUpManager创建modal(模态)窗口的背景样式
  2. HDU 6370 dfs+并查集
  3. 通过XMLHttpRequest,ActiveXObject实现ajax请求
  4. 系统性能不够原因可能是cpu不够,内存不够等等
  5. TList实现的任务队列
  6. Python访问MySQL数据库并实现其增删改查功能
  7. 【网络】TCP的拥塞控制
  8. [转]用AOP改善javascript代码
  9. MyBatis -- sql映射文件具体解释
  10. java的自动类型转换