竹马竹马chikuma
线段树合并
线段树中叶节点表示最大为该身价时可选人数,非叶节点维护最大值,答案即为shu[root[1]].mx。
插入只需将线段树从根到表示v[u]的节点路径上,mx全部取max ((1-v[u]-1)中最大值+1)即可。
合并时右儿子对左边的所有的max取max。
即为区间取最大值,单点修改,区间查询。
维护该子树中身价最多为i时最多可选人数。
代码如下:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=,f=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f==?x:-x;
}
int cn;
const int N=2e5+;
struct segment_tree{
#define lc ch[p][0]
#define rc ch[p][1]
int t[N<<],ch[N<<][],tot,lazy[N<<];
void pushup(int p)
{
t[p]=max(t[lc],t[rc]);
}
void pushdown(int p)
{
if(lc)
{
t[lc]+=lazy[p];
lazy[lc]+=lazy[p];
}
if(rc)
{
t[rc]+=lazy[p];
lazy[rc]+=lazy[p];
}
lazy[p]=;
}
void merge(int &p,int pre,int l,int r,int lx,int ly){
if(!p && !pre) return;
if(!pre)
{
lazy[p]+=ly;
t[p]+=ly;
return;
}
if(!p)
{
lazy[pre]+=lx;
t[pre]+=lx;
p=pre;
return;
}
if(l==r)
{
t[p]+=max(ly,t[pre]);
return;
}
int mid=(l+r)>>;
pushdown(p);
pushdown(pre);
merge(rc,ch[pre][],mid+,r,max(lx,t[lc]),max(ly,t[ch[pre][]]));
merge(lc,ch[pre][],l,mid,lx,ly);
pushup(p);
}
void insert(int &p,int l,int r,int x,int v){
if(!p)p=++tot;
t[p]=max(t[p],v);
if(l==r)return;
int mid=l+r>>;
if(x<=mid) insert(lc,l,mid,x,v);
else insert(rc,mid+,r,x,v);
}
int query(int p,int l,int r,int ql,int qr){
if(!p)return ;
if(ql<=l&&r<=qr)return t[p];
int mid=l+r>>,ret=;
pushdown(p);
if(ql<=mid)ret=max(ret,query(lc,l,mid,ql,qr));
if(mid<qr)ret=max(ret,query(rc,mid+,r,ql,qr));
return ret;
}
}seg;
struct edge{
int v,nxt;
}e[N];
int first[N],cnt=;
inline void add(int u,int v){
e[++cnt].v=v;e[cnt].nxt=first[u];first[u]=cnt;
}
int n,a[N],b[N],rt[N];
inline void dfs(int x){
for(int i=first[x],v,v1,v2;i;i=e[i].nxt){
v=e[i].v;
dfs(v);
v1=v2=;
seg.merge(rt[x],rt[v],,cn,v1,v2);
}
seg.insert(rt[x],,cn,a[x],((a[x]==)?:(seg.query(rt[x],,cn,,a[x]-)+)));
}
int main(){
freopen("chikuma.in","r",stdin);
freopen("chikuma.out","w",stdout);
long long size = << ;
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));
n=read();
for(int i=,x;i<=n;i++){
b[i]=a[i]=read();x=read();
if(x) add(x,i);
}
sort(b+,b+n+);
cn=unique(b+,b+n+)-b-;
for(int i=;i<=n;i++)
a[i]=lower_bound(b+,b+cn+,a[i])-b;
dfs();
cout<<seg.t[rt[]];
fclose(stdin);
fclose(stdout);
return ;
}
/*
6
3 0 1 1 2 1 3 1 4 1 5 1
*/
竹马竹马chikuma的更多相关文章
- [Swust OJ 772]--Friend(并查集+map的运用)
题目链接:http://acm.swust.edu.cn/problem/772/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- python --常用内置模块01
1.简单了解模块 模块就是我们把装有特定功能的代码进行归类的解构,从代码编写的单位来看我们的程序 从小到大的顺序:一条代码< 语句块<代码块(函数,类) < 模块 我 ...
- qwq。。胡诌qwq
1,十里寒塘,红楼灯火阑珊,晓风残月,思念醒了一半. 晨钟催落月,淑气催黄鸟,而花千树而你还未还,三月烟花,只剩远影孤帆,珠箔飘灯,大雁独自来返,柳絮铺地,桃花落了菀晚, 琴声弹起,雨落长安,长夜漫漫 ...
- 佛山6397.7539(薇)xiaojie:佛山哪里有xiaomei
佛山哪里有小姐服务大保健[微信:6397.7539倩儿小妹[佛山叫小姐服务√o服务微信:6397.7539倩儿小妹[佛山叫小姐服务][十微信:6397.7539倩儿小妹][佛山叫小姐包夜服务][十微信 ...
- 宜宾1178.9873(薇)xiaojie:宜宾哪里有xiaomei
宜宾哪里有小姐服务大保健[微信:1178.9873倩儿小妹[宜宾叫小姐服务√o服务微信:1178.9873倩儿小妹[宜宾叫小姐服务][十微信:1178.9873倩儿小妹][宜宾叫小姐包夜服务][十微信 ...
随机推荐
- Python--day65--Django框架介绍
原文链接:http://www.cnblogs.com/liwenzhou/p/8296964.html 做web开发用的是MVC框架: Django框架简介 MVC框架和MTV框架(了解即可) MV ...
- element-ui-——el-uploadexcel导入
布局文件:(选择文件放在了弹框内部——即点击导入按钮后弹框显示,先下载模板再选择文件点击提交按钮才上传) )) { this.$notify({ message: '数据导入成功', type: 's ...
- 2019-1-29-WPF-设置输入只能英文
title author date CreateTime categories WPF 设置输入只能英文 lindexi 2019-1-29 15:8:4 +0800 2018-2-13 17:23: ...
- UWP IRandomAccessStream 与 Stream 互转
本文告诉大家如何将 IRandomAccessStream 和 Stream 互转 如果在使用网络传输文件的时候,在 UWP 经常使用将 IRandomAccessStream 和 Stream 互转 ...
- C# 如何解析XML
- 更新到@vue/cli 4.1.1版本的前端开发前的准备
一.概念简述 1.node.js目的是提供一个JS的运行环境. 2.npm(node package manager)是一个JS包管理器. 二.检查自己的电脑是否已安装相关配置 1.查看node.js ...
- git之github解决冲突
1.先创建一个txt文件,并进行编辑 2.然后推送到github,过程看之前的教程. 3.在另一个文件夹拉取(用小乌龟拉取),分别在克隆文件夹和原本文件夹操作test.txt. 4.把本体推送给服务器 ...
- Angular 利用 marked.js 添加 Markdown + HTML 同时渲染的 Pipe
背景 最近在公司开发的一个项目需要在 Angular 上展示图文,并且需要同时支持 Markdown 和 HTML 对于同时支持 Markdown 和 HTML ,应该要分为编辑和渲染两部分考虑. 对 ...
- Spring||IQ
Here's the question about spring 1.Spring概述 Spring 是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应 ...
- 使用vue 对二进制文件 实现下载(blob对象
有很多网站会涉及到文件下载,这里我们使用axios 发送请求 接受数据 第一步 模仿jQ 封装接口 Vue.prototype.$xlsx_post = function (url, data, fu ...