【BZOJ4919】[Lydsy六月月赛]大根堆
题解:
我觉得数据结构写成结构体还是有必要的
因为不然一道题里出现了两个相同的数据结构由于名字很像很容易出错
另外初始化用segmenttree(){ }
首先裸的dp很好想
f[i][j]表示在i点,最大值<=j的点数最大值
看了别人的题解知道了可以用线段树合并来优化这个东西。。
我们考虑对于每个点,首先我们要合并它的子树
其实就是对于相同位置的点相加即可
然后考虑当前节点,我们应用f[v[x]-1]+1去更新v[x]-n之间的值(也就是取max操作)
不然是没法down的
1.当x,y其中有一个左二子没有的时候
就需要给它加一个sum标记
原因是,由于他没有左二子了,说明它对应的左二子的lazy值都是这个
所以要变成sum标记,对每一个子节点都加上这个
2.down的时候也要用lazy[fa]更新lazy[x] 原因是有sum[x]的存在
#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
const int INF=1e9;
#define IL inline
#define rint register int
int n,m,fa[N],vv[N],head[N],l;
struct re{
int a,b;
}a[N],v[N];
IL int max(int x,int y)
{
int z;
x>y?z=x:z=y;
return(z);
}
IL int min(int x,int y)
{
int z;
x<y?z=x:z=y;
return(z);
}
void arr(int x,int y)
{
a[++l].a=head[x];
a[l].b=y;
head[x]=l;
}
struct segmenttree
{
int cnt,rt[N],sum[N*],ls[N*],rs[N*],lz[N*];
#define mid ((h+t)>>1)
segmenttree(){cnt=;}
IL void down(int x)
{
if (ls[x]) lz[ls[x]]=max(sum[x]+lz[ls[x]],lz[x]),sum[ls[x]]+=sum[x];
if (rs[x]) lz[rs[x]]=max(sum[x]+lz[rs[x]],lz[x]),sum[rs[x]]+=sum[x];
sum[x]=;
}
int merge(int x,int y)
{
if (!x||!y) return x^y;
down(x); down(y);
if (!ls[x])
ls[x]=ls[y],lz[ls[x]]+=lz[x],sum[ls[x]]+=lz[x];
else if (!ls[y])
lz[ls[x]]+=lz[y],sum[ls[x]]+=lz[y];
else ls[x]=merge(ls[x],ls[y]);
if (!rs[x])
rs[x]=rs[y],lz[rs[x]]+=lz[x],sum[rs[x]]+=lz[x];
else if (!rs[y])
lz[rs[x]]+=lz[y],sum[rs[x]]+=lz[y];
else rs[x]=merge(rs[x],rs[y]);
lz[x]+=lz[y];
return x;
}
int query(int x,int h,int t,int pos)
{
if (x==) return ;
if (h==t) return lz[x];
down(x);
if (pos<=mid) return max(lz[x],query(ls[x],h,mid,pos));
else return max(lz[x],query(rs[x],mid+,t,pos));
}
void change(int &x,int h,int t,int h1,int t1,int k)
{
if (!x) x=++cnt;
if (h1<=h&&t<=t1)
{
lz[x]=max(lz[x],k);
return;
}
down(x);
if (h1<=mid) change(ls[x],h,mid,h1,t1,k);
if (mid<t1) change(rs[x],mid+,t,h1,t1,k);
}
}se1;
void dfs(int x,int fa)
{
int u=head[x];
while (u)
{
int v=a[u].b;
dfs(v,x);
se1.rt[x]=se1.merge(se1.rt[x],se1.rt[v]);
u=a[u].a;
}
se1.change(se1.rt[x],,n,vv[x],n,se1.query(se1.rt[x],,n,vv[x]-)+);
}
bool cmp(re x,re y)
{
return(x.a<y.a);
}
int main()
{
// freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
cin>>n;
for (int i=;i<=n;i++)
{
cin>>v[i].a>>fa[i];
v[i].b=i;
if (fa[i]) arr(fa[i],i);
}
sort(v+,v+n+,cmp);
v[].a=INF;
int cnt=;
for (int i=;i<=n;i++)
{
if (v[i].a!=v[i-].a) cnt++;
vv[v[i].b]=cnt;
}
dfs(,);
int ans2=;
for(int i=;i<=n;i++)
ans2=max(ans2,se1.query(se1.rt[],,n,i));
cout<<ans2;
return ;
}
【BZOJ4919】[Lydsy六月月赛]大根堆的更多相关文章
- 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并
[BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...
- bzoj 4919: [Lydsy六月月赛]大根堆
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
- bzoj 4919 [Lydsy1706月赛]大根堆 set启发式合并+LIS
4919: [Lydsy1706月赛]大根堆 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 599 Solved: 260[Submit][Stat ...
- 【BZOJ4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+动态规划
[BZOJ4922][Lydsy六月月赛]Karp-de-Chant Number Description 卡常数被称为计算机算法竞赛之中最神奇的一类数字,主要特点集中于令人捉摸不透,有时候会让水平很 ...
- [BZOJ4920][Lydsy六月月赛]薄饼切割
[BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \tim ...
- bzoj 4921: [Lydsy六月月赛]互质序列
4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 188 Solved: 110[Submit][Status ...
- [Lydsy1706月赛]大根堆
4919: [Lydsy1706月赛]大根堆 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 358 Solved: 150[Submit][Stat ...
- bzoj4919 [Lydsy1706月赛]大根堆
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
- BZOJ4919:[Lydsy1706月赛]大根堆(set启发式合并)
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
随机推荐
- 使用 CSS3 的 box-sizing 属性设置元素大小包含 border 与 padding
Ø 默认情况下,内部元素(如:input)的宽度或高度,是不会包含元素的边框和内边距的,这时就需要使用 box-sizing 属性设置该元素. Ø box-sizing 是 CSS3 的属性,可以 ...
- 单行纯文本框QLineEdit
继承 QWidget 天子骄龙
- Netty入门(2) - 核心概念
Netty Crash Course 一个Netty程序一般开始于Bootstrap类,通过设置程序后,使用Handlers来处理特定的event和设置Netty中的事件,从而处理多个协议数据,比如实 ...
- yolov3实践(二)
这次给大家带来一个有趣的项目,项目主要是Python写的,基于Keras,backend是tf. 首先,当我们回顾视觉目标检测这个任务时,我们可能纠结于如何使这个项目变得更加work,我理解的更加wo ...
- Python(十三)python的函数重载
首先,重载函数的功能是实现参数不同情况下功能相同的函数. 函数重载的目的是解决功能相同的函数的以下问题: 1.参数的类型: 2.参数的个数: 对于情况1,函数功能呢相同,参数不同的情况. python ...
- B - Birthday Boy Gym - 102007B
题目链接:https://cn.vjudge.net/contest/283924#problem/B 题目大意:给你n个人的信息,让你找出一个时间,要求让你选择一天,使得这一天的前一个生日距离它最远 ...
- ACM-ICPC 2018 南京赛区网络预赛 L题(分层图,堆优化)
题目链接: https://nanti.jisuanke.com/t/31001 超时代码: #include<bits/stdc++.h> using namespace std; # ...
- python - setitem/getitem/delitem类的内置方法
# class 内置方法: # __setitem__ # __getitem__ # __delitem__ class Test(): X = 100 def __getitem__(self, ...
- 【逆向工具】IDA使用6-签名文件制作
0x1 签名文件制作的方法: 找到静态编译的程序库 使用IDA中的fair工具包,对静态库操作,生成特征库(IDA6.8 是flair68.zip) 0x2 步骤 第一步:使用pcf生成对应静态库的p ...
- springboot系列二、springboot项目搭建
一.官网快速构建 1.maven构建项目 1.访问http://start.spring.io/ 2.选择构建工具Maven Project.Spring Boot版本2.1.1以及一些工程基本信息, ...