F[x][i]表示x的子树中取的数字<=i的最大值,线段树合并优化DP

写得很难看,并不知道好看的写法

#include<cstdio>
#include<algorithm>
using namespace std;
int cnt,n,Num,ans,last[200005],tag[10000005],ls[10000005],rs[13000005],E[200005],a[200005],Fa[200005],root[200005],ANS[200005],tree[10000005];
struct node{
int to,next;
}e[1000005];
void add(int a,int b){
e[++cnt].to=b;
e[cnt].next=last[a];
last[a]=cnt;
}
void push_down(int x){
if (ls[x]) tag[ls[x]]+=tag[x],tree[ls[x]]+=tag[x],tree[ls[x]]=max(tree[ls[x]],tree[x]);
if (rs[x]) tag[rs[x]]+=tag[x],tree[rs[x]]+=tag[x],tree[rs[x]]=max(tree[rs[x]],tree[x]);
tag[x]=0;
}
int merge(int x,int y){
if (!x) return y;
if (!y) return x;
push_down(x); push_down(y);
if (!ls[x]) ls[x]=ls[y],tree[ls[x]]+=tree[x],tag[ls[x]]+=tree[x];
else if (!ls[y]) tree[ls[x]]+=tree[y],tag[ls[x]]+=tree[y];
else ls[x]=merge(ls[x],ls[y]);
if (!rs[x]) rs[x]=rs[y],tree[rs[x]]+=tree[x],tag[rs[x]]+=tree[x];
else if (!rs[y]) tree[rs[x]]+=tree[y],tag[rs[x]]+=tree[y];
else rs[x]=merge(rs[x],rs[y]);
tree[x]+=tree[y];
return x;
}
int query(int t,int l,int r,int x){
if (!t) return 0;
if (l==r) return tree[t];
push_down(t);
int mid=(l+r)>>1;
if (x<=mid) return max(tree[t],query(ls[t],l,mid,x));
else return max(tree[t],query(rs[t],mid+1,r,x));
}
void insert(int &t,int l,int r,int x,int y,int Val){
if (l>y || r<x) return;
if (!t) t=++cnt;
if (l>=x && r<=y){
tree[t]=max(tree[t],Val);
return;
}
push_down(t);
int mid=(l+r)>>1;
insert(ls[t],l,mid,x,y,Val);
insert(rs[t],mid+1,r,x,y,Val);
}
void solve(int x){
for (int i=last[x]; i; i=e[i].next){
int V=e[i].to;
solve(V);
root[x]=merge(root[x],root[V]);
}
int Key=query(root[x],1,Num,a[x]-1);
insert(root[x],1,Num,a[x],Num,Key+1);
}
int main(){
scanf("%d",&n);
for (int i=1; i<=n; i++) {
scanf("%d%d",&a[i],&Fa[i]);
if (Fa[i]) add(Fa[i],i);
}
E[++n]=-1e9;
for (int i=1; i<=n; i++) E[i]=a[i];
sort(E+1,E+n+1);
Num=unique(E+1,E+n+1)-E-1;
for (int i=1; i<=n; i++) a[i]=lower_bound(E+1,E+Num+1,a[i])-E;
cnt=0;
solve(1);
for (int i=1; i<=Num; i++) ANS[i]=query(root[1],1,Num,i);
int ans=0;
for (int i=1; i<=Num; i++) ans=max(ans,ANS[i]);
printf("%d\n",ans);
return 0;
}

  

BZOJ 4919: [Lydsy1706月赛]大根堆的更多相关文章

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

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

  2. BZOJ 4919: [Lydsy1706月赛]大根堆 set启发式合并

    这个和 bzoj 5469 几乎是同一道题,但是这里给出另一种做法. 你发现你要求的是一个树上 LIS,而序列上的 LIS 有一个特别神奇的 $O(n\log n) $ 做法. 就是维护一个单调递增的 ...

  3. BZOJ.4919.[Lydsy1706月赛]大根堆(线段树合并/启发式合并)

    题目链接 考虑树退化为链的情况,就是求一个最长(严格)上升子序列. 对于树,不同子树间是互不影响的.仿照序列上的LIS,对每个点x维护一个状态集合,即合并其子节点后的集合,然后用val[x]替换掉第一 ...

  4. BZOJ 4919: [Lydsy1706月赛]大根堆 启发式合并

    我不会告诉你这是线段树合并的好题的... 好吧我们可以搞一个multiset在dfs时求出LIS(自带二分+排序)进行启发式合并,轻松加愉悦... #include<cstdio> #in ...

  5. BZOJ 4919 [Lydsy1706月赛]大根堆 (SRM08 T3)

    [题解] 求一个序列的LIS有一个二分做法是这样的:f[i]表示长度为i的上升序列中最后一个数最小可以是多少,每次二分大于等于当前数字x的f[j],把f[j]修改为x:如果找不到这样的f[j],那就把 ...

  6. [Lydsy1706月赛]大根堆

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

  7. bzoj4919 [Lydsy1706月赛]大根堆

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

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

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

  9. BZOJ4919[Lydsy1706月赛]大根堆-------------线段树进阶

    是不是每做道线段树进阶都要写个题解..根本不会写 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...

随机推荐

  1. C# 实现本地化日志管理

    1.新建一个类库解决方案 CommnoLog 2.新建两个文件夹 2.1FileUtil.cs  代码如下 public static class FileUtil { /// <summary ...

  2. 解决mysql本地数据库不能用ip访问的问题

    [转]http://gone18611.blog.163.com/blog/static/1851943120104705244116/ MYSQL数据库缺省安装后,其默认用户名ROOT如果只能以&l ...

  3. 【持续更新】Java 时间相关

    直接上代码: import java.util.*; import java.text.SimpleDateFormat; public class HelloWorld { public stati ...

  4. Java基本语法和变量

    1基本语法 1.1 标识符.关键字 在程序中用于定义名称的都为标识符,如文件名称.类名称.方法名称或变量名称等. 在Java中标识符的定义格式由字母.数字._(下划线),$所组成,不能以数字开头, 不 ...

  5. Outlook Web App 客户端超时设置

    这篇文章我们讨论一下,OWA 2013在公共和私人的电脑是如何启用和配置. Exchange 2013 Outlook Web App (OWA) 登录页不再允许用户选择无论他们正在使用公共的或私人的 ...

  6. BUG严重级别定义及注意事项

  7. Git项目管理常用命令

    安装Git Bash后,地址:https://git-scm.com/downloads 根据自己的操作系统选择对应是安装方式 可参见码云给出的文档:http://git.mydoc.io/?t=18 ...

  8. Android中一个关于ListView的奇怪问题

    今天在做项目的时候发现了一个比较奇怪的问题,是关于ListView的,即ListView的android:height属性会影响程序中ListView的getView()方法的调用次数,如果设置Lis ...

  9. UVA 10905 Children's Game (贪心)

    贪心,假如任意给出一个序列,如果两两交换了以后会变大,那么就交换,直到不能交换为止. #include<bits/stdc++.h> using namespace std; ; stri ...

  10. 团队作业——项目Alpha版本发布

    ---恢复内容开始--- https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1   https://edu.cnblogs.com ...