吉首大学2019年程序设计竞赛(重现赛) 干物妹小埋(线段树求最长上升子序列)
链接:https://ac.nowcoder.com/acm/contest/992/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
在之前很火的一个动漫《干物妹小埋》中,大家对小埋打游戏喝可乐的印象十分的深刻。
现在欧尼酱将小埋的快乐水全部分开藏在了家具的顶端。
小埋使出空中1080°转身接战术翻滚跳到任一家具上,她相信,只要她翻滚的足够快,欧尼酱就跟不上她。
1.为获取梦幻开局,小埋一套技能可以使她一开始掉落在任一家具上。
2.小埋家的家具按顺序给出,每个家具可跳可不跳,为避开欧尼酱的追击,小埋翻滚到某个家具上面后,只能向前继续翻滚。
3.启动超重力感应系统的小埋不会从较高的家具翻滚到较低的家具上。
4.由于每个家具上的快乐水都有对应的happy值,IQ==250的小埋会选择一条happy值总和最大的路线。
那么,最终小埋将获得的happy值总和是多少呢?
输入描述:
第一行一个整数n(0<n<=200000),表示小埋家的家具数。第二行n个整数,对于每个整数ai, 0<=ai<=10^9,表示第i个家具的高度。第三行n个整数,对于每个整数vi, 0<=vi<=10^9,表示第i个家具上的快乐水的happy值。
输出描述:
一个整数,表示小埋获得的happy值总和。
示例1
输入
复制
6
2 1 1 3 3 4
3 1 1 1 1 1
输出
复制
6
说明
路线:2->3->3->4答案:3+1+1+1
不错不错,补这个题的时候学会了如何用线段树求最长子序列。
普通求最长上升子序列的题:
先说最简单的做法:
一种是最常见的dp方法,令f[i]表示以A[i]元素结尾的LIS长度,那么,F[i]=max{F[j]+1) 其中1<=j<i,A[j]<A[i],边界是初始化F[i]=1,复杂度O(n^2)
那么我们通过线段树维护这个max值就成功的把时间复杂度降下来了。
离散化后枚举h[i]先查询小于他的区间内最大的是多少,然后将这个mx+v[i]插入这个h[i]对应的位置上去,这个有点类似线段树求逆序数的操作。。
AC代码:
#include <bits/stdc++.h>
#define ls id<<1
#define rs id<<1|1
using namespace std;
typedef long long ll;
const int N=2e5+10;
int a[N],b[N],c[N],n,tot;
ll mx[N*4];
int getid(int x){return lower_bound(c+1,c+1+tot,x)-c;
}
ll qu(int id,int l,int r,int ql,int qr){if(ql<=l&&r<=qr) return mx[id];int mid=l+r>>1;ll ans=0;if(ql<=mid) ans=max(ans,qu(ls,l,mid,ql,qr));if(qr>mid )ans=max(ans,qu(rs,mid+1,r,ql,qr));return ans;
}
void up(int id,int l,int r,int pos,ll val){if(l==r) {mx[id]=val;return ;}int mid=l+r>>1;if(pos<=mid) up(ls,l,mid,pos,val);else up(rs,mid+1,r,pos,val);mx[id]=max(mx[ls],mx[rs]);
}
int main()
{cin>>n;for(int i=1;i<=n;++i){scanf("%d",&a[i]);c[i]=a[i];}for(int i=1;i<=n;++i) scanf("%d",&b[i]);sort(c+1,c+1+n);tot=unique(c+1,c+1+n)-c-1;ll ans=0;for(int i=1;i<=n;++i){int id=getid(a[i]);ll mxx=qu(1,1,tot,1,id);mxx+=b[i];ans=max(ans,mxx);up(1,1,tot,id,mxx);}printf("%lld\n",ans);
}
吉首大学2019年程序设计竞赛(重现赛) 干物妹小埋(线段树求最长上升子序列)相关推荐
- 吉首大学2019年程序设计竞赛(重现赛)B——干物妹小埋(树状数组+二分)
链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 题目描述 在之前很火的一个动漫<干物妹小埋>中,大家对小埋打游戏喝可乐的印象十分的深 ...
- 吉首大学2019年程序设计竞赛(重现赛) B 干物妹小埋
链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 干物妹小埋-树状数组-吉首大学2019年程序设计竞赛
题目链接:https://ac.nowcoder.com/acm/contest/992/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64b ...
- 吉首大学校赛B——干物妹小埋(线段树求最大递增子序列)
链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 干物妹小埋 树状数组
链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 树状数组 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...
- 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)---E---小乐乐匹配字符串(最长公共子序列)
链接:https://ac.nowcoder.com/acm/contest/301/E 来源:牛客网 小乐乐有字符串str1,str2. 小乐乐想要给他们找朋友. 小乐乐想知道在这两个字符串中最多能 ...
- 吉首大学2019年程序设计竞赛
Problem A SARS病毒 https://ac.nowcoder.com/acm/contest/992/A 题意: 题解: C++版本一 题解:矩阵快速幂+费马小定理 /* *@Author ...
- 吉首大学2019年程序设计竞赛(重现赛) J 滑稽树下你和我 (递归)
链接:https://ac.nowcoder.com/acm/contest/992/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 吉首大学2019年程序设计竞赛-F 天花乱坠
题目链接:https://ac.nowcoder.com/acm/contest/992/F 题意:给定正n边形,边长为100,以每条边的中点连线构成新的正n边形,无限循环下去,求所有边的长度和. 思 ...
最新文章
- python脚本编写_【PyQGIS】编写用于处理框架(QGIS3)的Python脚本
- 《HFSS电磁仿真设计从入门到精通》一第2章 入门实例——T形波导的内场分析和优化设计...
- 【OO学习】OO第四单元作业总结及OO课程总结
- ios 如何在cell中去掉_经典问题:代码中如何去掉烦人的“!=nullquot;判空语句
- 新闻与传播c刊_新闻传播类c刊有哪些
- linux cp源码_为Linux的cp和mv命令添加进度条
- Android之让代码跑在主线程(无context上下文)的封装
- 322. 零钱兑换 golang 动态规划
- 02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架
- [Hash应用问题] 例3.2 给出n个整数,按从大到小的顺序输出前m大的数
- 国内首例:飞步无人卡车携手中国邮政、德邦投入日常运营
- 大文件如何传输到服务器,大文件如何快速传输到云服务器
- 通过BeanDefinitionReader获取BeanDefinition的三种不同方式
- 【图】max51开发板(手工焊接)
- hao123首页源码 html,html css应用高仿hao123网站
- 《Python Excel 教程》
- python提取一行_如何从numpy数组中提取任意一行值?
- c与c++的struct区别
- 安卓学习之持久化技术(数据库操作)
- RISC-V架构的开源处理器分析