【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. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
随机推荐
- 006、容器 What、Why、How(2018-12-21 周五)
参考https://www.cnblogs.com/CloudMan6/p/6751516.html What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,是应用 ...
- 20155117王震宇 2016-2017-2 《Java程序设计》第六周学习总结
教材学习内容总结 IO流的分类: 根据流的数据对象来分: 高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStrea ...
- SEO之robots.txt
[关键词:robot.txt,sitemap,User-Agent,Disallow,Allow][声明:摘自Wikipedia] 1. 定义:robots.txt(统一小写)是一种存放于网站根目录下 ...
- CSS之清除浮动(span/clearfix)
一.问题描述 web网页设计中,在div元素中有时候常伴有图文结合的post组件.为了使得文本在图像周围环绕,那么需要对图像区域使用float浮动.如果不做清除浮动,则会出现如下结果: 图像比文本高, ...
- CF448C Painting Fence (贪心分治)
题面 \(solution:\) 一道蛮水的分治题,但思想很不错(虽然我还是非常天真的以为是积木大赛原题,并且居然还有30分) 看到这个题目,根据贪心的一贯风格,我们肯定能想到将整个栅栏的下面某部分直 ...
- shell 终端常用插件
参考链接: http://get.ftqq.com/992.get 1.zsh 2.autojump 3.apt-get install lamp-server^ 4.tldr 5.tree (显示目 ...
- dfs(通过控制点的编号来得出每个点的坐标)
题目链接:https://cn.vjudge.net/contest/234497#problem/A #include<iostream> #include<string> ...
- SILC超像素分割算法详解(附Python代码)
SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...
- Java导出txt模板——(一)
导出txt文件时候\r\n才能换行 java代码 package DRDCWordTemplates; import java.io.BufferedWriter; import java.io.Fi ...
- vscode常用快捷键和插件(持续更新),以及一些常用设置的坑和技巧
一 常用快捷键 ctrl+shift+p: 打开命令面板,最常用了 ctrl+p: 搜索窗口: 直接输入文件名,跳转到文件 > 可以进入 Ctrl+Shift+P 模式 ? 列出当前可执行的动 ...