传送门

题意:查询树上根节点值*子树中权值和$\le m$的最大数量 最大值是多少


求$DFS$序,然后变成区间中和$\le m$最多有几个元素,建主席树,然后权值线段树上二分就行了

$WA$:又把边表开小了.....

好吧我$zz$了有根树加无向边干什么....

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define lc(x) t[x].l
#define rc(x) t[x].r
typedef long long ll;
const int N=1e5+;
int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,m,mp[N];
struct Ninjia{
int w,li,id;
bool operator <(const Ninjia &r)const{return w<r.w;}
}a[N];
inline bool cmpId(Ninjia a,Ninjia b){return a.id<b.id;}
struct Edge{
int v,ne;
}e[N<<];
int h[N],cnt;
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
int L[N],R[N],dfc,pos[N];
void dfs(int u,int fa){
L[u]=++dfc; pos[dfc]=u;
for(int i=h[u];i;i=e[i].ne)
if(e[i].v!=fa) dfs(e[i].v,u);
R[u]=dfc;
} struct Node{
int l,r,size;
ll sum;
}t[N*];
int sz,root[N];
void fIns(int &x,int l,int r,int p){
t[++sz]=t[x];x=sz;
t[x].size++;
t[x].sum+=(ll)mp[p];
if(l==r) return;
int mid=(l+r)>>;
if(p<=mid) fIns(lc(x),l,mid,p);
else fIns(rc(x),mid+,r,p);
}
int fQue(int x,int y,int l,int r,ll m){
//printf("fQue %d %d %d %d %d %d %lld %lld\n",x,y,l,r,t[x].size,t[y].size,t[x].sum,t[y].sum);
if(l==r){
ll lsum=t[y].sum-t[x].sum;
return lsum<=m ? t[y].size-t[x].size : ;
}else{
int mid=(l+r)>>;
ll lsum=t[lc(y)].sum-t[lc(x)].sum;//printf("lsum %lld %lld\n",lsum,m);
if(m<=lsum) return fQue(lc(x),lc(y),l,mid,m);
else return t[lc(y)].size-t[lc(x)].size+fQue(rc(x),rc(y),mid+,r,m-lsum);
}
}
int rt=,u;
int main(){
freopen("in","r",stdin);
n=read();m=read();
for(int i=;i<=n;i++){
u=read();if(u==) rt=i;
ins(u,i),a[i].w=read(),a[i].li=read(),a[i].id=i;
}
sort(a+,a++n);
for(int i=;i<=n;i++) mp[i]=a[i].w,a[i].w=i;
sort(a+,a++n,cmpId);
//for(int i=1;i<=n;i++) printf("a %d %d %d\n",a[i].id,a[i].w,mp[a[i].w]);
dfs(rt,);
//for(int i=1;i<=n;i++) printf("LR %d %d %d\n",i,L[i],R[i]);
//for(int i=1;i<=n;i++) printf("%d ",pos[i]);puts("");
for(int i=;i<=n;i++) root[i]=root[i-],fIns(root[i],,n,a[pos[i]].w);
ll ans=;
for(int i=;i<=n;i++) ans=max(ans,(ll)a[i].li*fQue(root[L[i]-],root[R[i]],,n,m));
printf("%lld",ans);
}

BZOJ 2809: [Apio2012]dispatching [主席树 DFS序]的更多相关文章

  1. BZOJ - 2809 dispatching 主席树+dfs序

    在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的 ...

  2. bzoj 3772 精神污染 主席树+dfs序

    精神污染 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 637  Solved: 177[Submit][Status][Discuss] Descri ...

  3. [Apio2012]dispatching 主席树做法

    bzoj 2809: [Apio2012]dispatching http://www.lydsy.com/JudgeOnline/problem.php?id=2809 Description 在一 ...

  4. 51 nod 1681 公共祖先 (主席树+dfs序)

    1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...

  5. 【BZOJ1803】Spoj1487 Query on a tree III 主席树+DFS序

    [BZOJ1803]Spoj1487 Query on a tree III Description You are given a node-labeled rooted tree with n n ...

  6. BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )

    枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...

  7. bzoj 2809: [Apio2012]dispatching -- 可并堆

    2809: [Apio2012]dispatching Time Limit: 10 Sec  Memory Limit: 128 MB Description 在一个忍者的帮派里,一些忍者们被选中派 ...

  8. bzoj 2809: [Apio2012]dispatching【dfs序+主席树】

    可并堆就可以,但是想复健一下主席树. 考虑枚举管理者,然后选忍者的时候在子树中贪心的从小到大选.做成dfs序就是选区间内和小于等于k的最多点.可以用主席树,查询的时候在主席树上二分即可 这里注意,为了 ...

  9. 【SPOJ】10628. Count on a tree(lca+主席树+dfs序)

    http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. ...

随机推荐

  1. EMC题

    [面试题]EMC易安信面试题解 1. 除以59的余数是多少. 来自wiki:费马小定理是数论中的一个定理:假如a是一个整数,p是一个質数,那么 如果a不是p的倍数,这个定理也可以写成 这个书写方式更加 ...

  2. RAID 详解

    一.什么是RAID 磁盘阵列全名是『Redundant Arrays of Inexpensive Disks, RAID 』,英翻中的意思是:容错式廉价磁盘阵列. RAID 可以透过一个技术(软件或 ...

  3. 两句话概括cmd和amd的区别

    === | === | === | ===AMD | 速度快 | 会浪费资源 | 预先加载所有的依赖,直到使用的时候才执行=== | === | === | ===CMD | 只有真正需要才加载依赖 ...

  4. Kubernetes volumes简介

    容器中的磁盘文件生命周期比较短暂,在一些比较复杂的容器应用中会产生一些问题.一.容器crash后,kubelet会重启该容器,但这些文件会丢失掉.二.pod中的多个容器经常需要共享文件.因此,Kube ...

  5. 使用nginx处理静态资源请求,其余交给node

    由于项目后台使用的是node,然而node不适合对静态资源的处理,因为他的异步处理(事件轮询)机制,所以更擅长的是密集I/O型的应用,所以我就有了一个想法,使用nginx来做反向代理,当请求的是静态资 ...

  6. dede表前缀不定时,查询表#@__archives

    $query = "SELECT arc.*,tp.typedir,tp.typename,               tp.isdefault,tp.defaultname,tp.nam ...

  7. eclipse导入项目之后有感叹号

    说明项目的编译过程报错.导致原因:项目引入后,需要重新配置jar包路径. 1.右击你的项目-->Build Path-->Configure Build Path.... 2.在弹出的对话 ...

  8. python基础5之装饰器

    内容概要: 一.装饰器前期知识储备 1.python解释函数代码过程: python解释器从上往下顺序解释代码,碰到函数的定义代码块不会立即执行它,而是将其放在内存中,等到该函数被调用时,才执行其内部 ...

  9. mysql-冗余和重复索引

    mysql允许在相同列上创建多个索引,无论是有意还是无意,mysql需要单独维护重复的索引,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能. 重复索引是指的在相同的列上按照相同的顺序创建 ...

  10. 如何从零开始设计一款漂亮的移动APP?

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 我13岁时开始学习平面设计.我从网上课程学会了设计网站,并习惯于全天使用Photoshop和Affi ...