题解:

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

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

另外初始化用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. Bellman-Ford算法:POJ No.3169 Layout 差分约束

    #define _CRT_SECURE_NO_WARNINGS /* 4 2 1 1 3 10 2 4 20 2 3 3 */ #include <iostream> #include & ...

  2. Neo4j安装&入门&一些优缺点

    本篇将介绍Neo4j的安装,入门,和自己使用了一段时间后发现的优点缺点,争取简洁和实用. 如果你是第一次接触Neo4j,并且之前也都没接触过类似的Graph Database的话,建议先浏览一下我之前 ...

  3. MyBatis全局配置文件mybatis-config.xml

    1.在官方下载的mybatis-3.4.5.zip压缩包中,有我们需要的mybatis核心jar包和mybatis的快速入门的pdf文件 在mybatis的快速入门的pdf文件中,复制如下代码到我们项 ...

  4. Java基础编程题——打印九九乘法表

    package com.yangzl.basic; /** * 九九乘法表 * @author Administrator * */ public class Nine_Nine_Multiplica ...

  5. 电脑爱好——PE系统分区工具 分区时函数错误,报000000001错误 解决方法

    1.启动硬盘分区软件diskgenius(一般都是这个分区软件,这个PE系统自带的居多) 2.将现有的分区全部删掉 3.选择菜单栏——“硬盘”——“转换分区表类型为MBR格式”——转换完成 4.快速分 ...

  6. asp.net mvc url应用

    //url加密与解密string res1 = HttpUtility.UrlEncode("7Z2K5Lgk/iI="); //值是7Z2K5Lgk%2fiI%3d string ...

  7. pyqt5-多线程QThread类

    要实现多线程,我们要先继承QThread类并重新实现其中的run()函数,也就是说把耗时的操作放入run()函数中 import sys from PyQt5.QtCore import Qt, QT ...

  8. PMM安装-第一篇

    一 简介 今天来聊聊 PMM安装使用 二 安装 1 server端执行   curl -sSL https://get.daocloud.io/docker | sh    docker pull p ...

  9. Django学习手册 - 模板语言(前端获取后台数据)

    先在views视图内,定义列表数据,以及字典数据.运用render函数传递两个列表数据至前端. from django.shortcuts import render list_info = [ {& ...

  10. 实现Servlet容器一

    本文是阅读<深度解析Tomcat>的笔记. 源码:http://www.brainysoftware.com/source/9780975212806.zip├── src│   └── ...