抓知了

题目

深海龙王和水葫芦娃放了暑假闲的无聊,一天他们路过一棵树,听到树上的知了叫的好欢啊∼
深海龙王准备抓几只知了送给水葫芦娃。他发现面前的这棵树是一颗以1 号节点为根节点的一颗有根树,同时他又发现这颗树上的每一个节点i 上都恰好停有一只蝉,正在愉快的以ai 的响声鸣叫∼
深海龙王会从1 号节点起沿着树边一直爬,直到爬到一个叶子节点(请不要在意他怎么下来),在这途中他可以选择一些他经过的蝉并将它们抓起来。但是水葫芦娃希望深海龙王抓的知了能发出越来越响的鸣叫声,起码得要单调不减!

题意

给你一颗树(n<=100000),让你求上面的最长不下降子序列。

分析

其实不要被树吓到了,这是一道简单题,我们仍然可以用 nlogn 的方法去做这道题。
我们可以从根开始做,然后每次更新每个节点的时候递归下去
递归完后,就可以直接去把值还原。
在这里,顺便补充一下,如何 nlogn 求最长不下降子序列:
我们可以发现,原来的dp方程f[i]=f[j]+1,中a[j]的值,
我们想保留j,仅当f[j]最大时,a[j]最小(我们可以贪心的想,这样可以为后面贡献更大)
于是我们便可以接着根据这个思路接着想下去:
从头开始枚举,设答案是ans,f[k]表示答案为k时最小的a[j]的值是多少。
那么若枚举的a[i]>f[ans]那么ans++,f[ans]=a[i];
上面便表示a[i]可以对答案做出贡献,那么若不能大于呢?它还有没有贡献呢?其实还是一样是有的!
我们二分出最大的k,使得 f[k]<a[i] ,当然f数组是具有递增性质的



function search(x,y:longint):longint;
var mid,l,r,ty:longint;
begin
    l:=1;r:=x;
    while l<r do begin
        mid:=(l+r)shr 1;
        if f[mid]<=y then l:=mid+1 else r:=mid;
    end; exit(l);
end;
    for i:=1 to num do begin
        if a[i]>f[we] then begin
           inc(we);f[we]:=a[i];
        end else begin
           sd:=search(we,a[i]);
           f[sd]:=min(f[sd],a[i]);
        end;
    end;

(很明显,f[u]表示的是答案为u的a的值,f[u+1]若存在,那么必定是大于前面一个的最小值的)
但是还要注意f[i]的值实际上是不合法的(也就是说这种方法只限用于求答案,但是不求具体的每个值)请读者自己思考!

代码

type
   arr=array[1..100005] of longint;
var
    n,x,i,nu,ans:longint;
    last,next,b:array[1..100005] of longint;
    a,f:array[1..100005] of longint;
procedure insert(x,y:longint);
begin
    inc(nu);
    b[nu]:=y;
    next[nu]:=last[x];
    last[x]:=nu;
end;
function search(x,y:longint):longint;
var mid,l,r,ty:longint;
begin
    l:=1;r:=x;ty:=0;
    while l<r do begin
        mid:=(l+r)shr 1;
        if f[mid]<=y then l:=mid+1 else r:=mid;
        inc(ty);
    end; exit(l);
end;
function min(l,r:longint):longint;
begin
   if l<r then exit(l) else exit(r);
end;
function max(l,r:longint):longint;
begin
   if l<r then exit(r) else exit(l);
end;
procedure dfs(x,we:longint);
var p,pe,po,lie,op:longint;
begin
    p:=last[x];
    while p<>0 do begin
        if a[b[p]]>=f[we] then begin
           pe:=we+1;
           po:=f[we];op:=we;
           f[pe]:=a[b[p]];
        end else begin
           lie:=search(we,a[b[p]]);
           pe:=we;po:=f[lie];op:=lie;
           f[lie]:=min(f[lie],a[b[p]]);
        end;
        dfs(b[p],pe);
        f[op]:=po;
        p:=next[p];
    end;
    ans:=max(ans,we);
end;
begin
assign(input,'cicada.in');reset(input);
assign(output,'cicada.out');rewrite(output);
    readln(n);
    for i:=2 to n do begin
        read(x);
        insert(x,i);
    end;
    fillchar(f,sizeof(f),128);
    for i:=1 to n do read(a[i]);
    f[1]:=a[1];
    dfs(1,1);
    writeln(ans);
close(input);close(output);
end.
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
了课堂是一个在线教育平台,提供了丰富多样的课程内容。其中,flask web是其中一门非常受欢迎的课程。 Flask是一个基于Python语言开发的轻量级Web应用框架。它简洁易用,但功能强大,因此在Web开发中被广泛应用。Flask Web课程旨在教授学员如何使用Flask框架构建自己的Web应用程序。 在Flask Web课程中,学员将学习到如何搭建一个完整的Web应用程序。首先,课程会介绍Flask框架的基本概念和使用方法,学员将了解如何创建Flask应用和处理路由。接着,课程会涵盖数据库的使用,学员将学会如何与数据库进行交互,以存储和检索数据。 此外,Flask Web课程还会教授学员如何处理表单数据和用户认证。表单是Web应用中常见的用户输入形式,学员将学习如何处理表单数据,并对用户输入进行验证和处理。同时,课程还会介绍用户认证和授权的方法,以确保只有授权用户可以访问特定的页面或功能。 在课程的实践部分,学员将有机会建立自己的Web应用程序。通过完成一系列的编程任务和项目,学员将应用所学的识,并将其运用到实际项目中。 总之,了课堂的Flask Web课程是一门全面而实践性强的课程,旨在帮助学员掌握使用Flask框架构建Web应用程序的技能。无论是对于想要从事Web开发的人来说,还是对于已经有一定经验的开发者来说,这门课程都将带来很大的收益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值