BZOJ 2809: [Apio2012]dispatching [主席树 DFS序]
题意:查询树上根节点值*子树中权值和$\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序]的更多相关文章
- BZOJ - 2809 dispatching 主席树+dfs序
在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级.为保密,同时增强忍者们的 ...
- bzoj 3772 精神污染 主席树+dfs序
精神污染 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 637 Solved: 177[Submit][Status][Discuss] Descri ...
- [Apio2012]dispatching 主席树做法
bzoj 2809: [Apio2012]dispatching http://www.lydsy.com/JudgeOnline/problem.php?id=2809 Description 在一 ...
- 51 nod 1681 公共祖先 (主席树+dfs序)
1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...
- 【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 ...
- BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )
枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...
- bzoj 2809: [Apio2012]dispatching -- 可并堆
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MB Description 在一个忍者的帮派里,一些忍者们被选中派 ...
- bzoj 2809: [Apio2012]dispatching【dfs序+主席树】
可并堆就可以,但是想复健一下主席树. 考虑枚举管理者,然后选忍者的时候在子树中贪心的从小到大选.做成dfs序就是选区间内和小于等于k的最多点.可以用主席树,查询的时候在主席树上二分即可 这里注意,为了 ...
- 【SPOJ】10628. Count on a tree(lca+主席树+dfs序)
http://www.spoj.com/problems/COT/ (速度很快,排到了rank6) 这题让我明白了人生T_T 我知道我为什么那么sb了. 调试一早上都在想人生. 唉. 太弱. 太弱. ...
随机推荐
- 微信小程序个人心得
尊重原创:http://blog.csdn.net/qq_28832135/article/details/52796048 昨天看了一下微信小程序官方文档,总结一下自己学习的个人心得. 首先从官方文 ...
- 解决jsp中编辑和删除时候弹出框闪退的问题。
---恢复内容开始--- /* 火箭设备特殊记载</li> <!-- yw4 --> */ function getYw4DL(){ var controlparm={&quo ...
- Centos7安装docker-compse踩过的坑
一.概要 本文,我们介绍如何在centos7环境下安装docker-compose, 记录下安装过程步骤以及遇到的问题还有解决办法. 二.安装方式 1.官方安装方式 sudo curl -L ht ...
- 常用Windows DOS命令项目部署经常用到
img { max-width: 100% } 前两天部署.netcore项目,首先是生产环境域名访问不了,再到.netcore项目IIS部署502.5,在到莫名其妙的500,在排查项目部署问题的时候 ...
- JAVA:成员变量和局部变量的区别
1.作用于不同: 局部变量的作用域仅限于定义它的方法 成员变量的作用域在整个类的内部都是可见的 2.初始值不同 JAVA会给成员变量一个初始值 JAVA不会给局部变量赋予初始值 3.在同一个方法中,不 ...
- php的底层原理
PHP说简单,但是要精通也不是一件简单的事.我们除了会使用之外,还得知道它底层的工作原理. PHP是一种适用于web开发的动态语言.具体点说,就是一个用C语言实现包含大量组件的软件框架.更狭义点看,可 ...
- two Pass方法连通域检测
原理: Two-Pass方法检测连通域的原理可参见这篇博客:http://blog.csdn.net/lichengyu/article/details/13986521. 参考下面动图,一目了然. ...
- 我的java学习之路--Reflect专题
学习网址:http://www.imooc.com/video/3725 1.Class类的使用 class类 在面向对象的世界里,万事万物皆对象 java语言中,静态的成员.普通数据类型类不是对象. ...
- Diffie-Hellman密钥交换
Diffie-Hellman密钥交换(DHKE)是由Whitfield Diffie和Martin Hellman在1976年提出的.密钥交换方案提供了实际中密钥分配问题的解决方案,即允许双方通过不安 ...
- WPF 简易新手引导
这两天不忙,所以,做了一个简易的新手引导小Demo.因为,不是项目上应用,所以,做的很粗糙,也就是给需要的人,一个思路而已. 新手引导功能的话,就是告诉用户,页面上操作的顺序,第一步要做什么,第二步要 ...