题解:

我觉得数据结构写成结构体还是有必要的

因为不然一道题里出现了两个相同的数据结构由于名字很像很容易出错

另外初始化用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六月月赛]大根堆的更多相关文章

  1. 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并

    [BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...

  2. bzoj 4919: [Lydsy六月月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  3. bzoj 4919 [Lydsy1706月赛]大根堆 set启发式合并+LIS

    4919: [Lydsy1706月赛]大根堆 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 599  Solved: 260[Submit][Stat ...

  4. 【BZOJ4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+动态规划

    [BZOJ4922][Lydsy六月月赛]Karp-de-Chant Number Description 卡常数被称为计算机算法竞赛之中最神奇的一类数字,主要特点集中于令人捉摸不透,有时候会让水平很 ...

  5. [BZOJ4920][Lydsy六月月赛]薄饼切割

    [BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \tim ...

  6. bzoj 4921: [Lydsy六月月赛]互质序列

    4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 188  Solved: 110[Submit][Status ...

  7. [Lydsy1706月赛]大根堆

    4919: [Lydsy1706月赛]大根堆 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 358  Solved: 150[Submit][Stat ...

  8. bzoj4919 [Lydsy1706月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  9. BZOJ4919:[Lydsy1706月赛]大根堆(set启发式合并)

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

随机推荐

  1. CodeChef - CRYPCUR

    题目链接 AMRExchange is the latest cryptocurrency exchange that has become very popular among cryptocurr ...

  2. windows Zookeeper本地服务化

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  3. Python复习笔记(一)高级变量类型

    目标 列表元组 字典 字符串 公共方法 变量高级 01. 列表 02. 元组 03. 字典 04. 字符串 1)判断类型 - 9 2) 查找和替换 - 7 3) 大小写转换 - 5 4) 文本对齐 - ...

  4. Bootstrap --对话框及提示框的处理和优化

    源模态框使用:http://www.runoob.com/bootstrap/bootstrap-modal-plugin.html <!-- 按钮触发模态框 --> <button ...

  5. Bleve代码阅读(二)——Index Mapping

    引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式. ...

  6. Managers经理/代理形式的数据共享

    代理方式实现进程间共享字典和列表形式的数据, 代码块: import os from multiprocessing import Process,Manager def f(d,l,normalLi ...

  7. mysql 案例~mysql主从复制延迟处理(2)

    一 简介:今天来聊聊周期性从库延迟的问题,是上一篇的基础分析的一个场景 二 背景:近期每天的指定时间段,收到从库延迟的报警,然后过一段时间恢复.由于从库是提供读服务的,所以需要解决 三 分析思路: 1 ...

  8. vlc-android 的编译过程

    参考官方文档:https://wiki.videolan.org/AndroidCompile#Get_VLC_Source 值得注意的的地方: 1.切记安装以下工具 sudo apt-get ins ...

  9. Linux input子系统简介

    1.前言 本文主要对Linux下的input子系统进行介绍 2. 软件架构 图 input子系统结构图 input子系统主要包括三个部分:设备驱动层.核心层和事件层.我们可以分别理解为:具体的输入设备 ...

  10. 在Ubuntu中通过update-alternatives切换软件版本

    update-alternatives是ubuntu系统中专门维护系统命令链接符的工具,通过它可以很方便的设置系统默认使用哪个命令.哪个软件版本,比如,我们在系统中同时安装了open jdk和sun ...