
牛客挑战赛36 C 纸飞机(树状数组)
发布日期:2021-05-08 15:14:15
浏览次数:17
分类:精选文章
本文共 1546 字,大约阅读时间需要 5 分钟。
链接:https://ac.nowcoder.com/acm/contest/3782/C
来源:牛客网直线上有n座山峰,第i座的高度为hi。从某座山峰上放飞一架纸飞机,它可以从左往右依次经过一系列高度严格递减的山头。
假设五座山峰的高度依次是3,4,3,2,1。从第一座山峰上放飞的纸飞机可以依次经过第一、四、五座山峰,但不能经过第二、三座山峰。 对于每座山峰,求出要经过除这座山峰外的每座山峰,至少需要放飞多少纸飞机。(每架纸飞机的起点可以不同) 输入描述: 第一行包括一个正整数n。第二行包括n个正整数,第i个数表示第i座山峰的高度hi。
输出描述:
输出一行,包括n个用空格隔开的正整数,第i个数表示除去第i座山峰的答案。 示例1 输入 5 2 4 3 1 5输出
2 3 3 3 2备注:
1≤n≤106 1≤hi≤230 思路:这题其实就是最小链覆盖问题,最小链覆盖等于最长反链,于是就是求去掉i这个值以后的最长LIS的长度。以每个点i为结尾的最长LIS用树状数组很容易求,记为Max,但去点i位置的数后的最长LIS怎么求呢?我们可以判断一下每一位是不是有可能是最初的LIS上的点,如果这些点都是唯一的,不能被替换的话,那么答案就是Max-1,如果能替换就是Max;比如样例2 4 3 1 5,最长链可能是2 4 5,4是最长链上的一点,但是去掉4以后,还有3可以替换4的位置是不是?#include#define lowbit(i) ((i)&(-i))using namespace std;const int maxn=1e6+1;int n,size,a[maxn],b[maxn],c[maxn],vis[maxn],vis2[maxn]={ 0},cns[maxn]={ 0},num[maxn],Max=0;void add(int x,int v){ while(x<=size) c[x]=max(c[x],v),x+=lowbit(x);}int query(int x){ int res=0; while(x) res=max(res,c[x]),x-=lowbit(x); return res;}int main(){ scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i]; sort(b+1,b+1+n); size=unique(b+1,b+1+n)-b-1; for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+1+size,a[i])-b;//离散化 for(int i=1;i<=n;++i) num[i]=query(a[i])+1,add(a[i],num[i]),Max=max(Max,num[i]);//求到i这个位置为止的最长lIS vis[Max+1]=1e9+1; for(int i=n;i>=1;--i) if(vis[num[i]+1]>=a[i])//判断它是不是最长LIS上的点 { vis[num[i]]=max(vis[num[i]],a[i]);vis2[i]=1; } for(int i=1;i<=n;++i) if(vis2[i]) cns[num[i]]++;//统计一下这个数是否有重复,有重复的话就可以替换 for(int i=1;i<=n;++i) printf("%d ",Max-(vis2[i]&&cns[num[i]]==1)); }
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月28日 08时16分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
80. Remove Duplicates from Sorted Array II
2021-05-09
83. Remove Duplicates from Sorted List
2021-05-09
410. Split Array Largest Sum
2021-05-09
开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?
2021-05-09
Vue3发布半年我不学,摸鱼爽歪歪,哎~就是玩儿
2021-05-09
《实战java高并发程序设计》源码整理及读书笔记
2021-05-09
Java开源博客My-Blog(SpringBoot+Docker)系列文章
2021-05-09
程序员视角:鹿晗公布恋情是如何把微博搞炸的?
2021-05-09
【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?
2021-05-09
Linux应用-线程操作
2021-05-09
多态体验,和探索爷爷类指针的多态性
2021-05-09
系统编程-进程间通信-无名管道
2021-05-09
记2020年初对SimpleGUI源码的阅读成果
2021-05-09
C语言实现面向对象方法学的GLib、GObject-初体验
2021-05-09
系统编程-进程-ps命令、进程调度、优先级翻转、进程状态
2021-05-09
为什么我觉得需要熟悉vim使用,难道仅仅是为了耍酷?
2021-05-09
一个支持高网络吞吐量、基于机器性能评分的TCP负载均衡器gobalan
2021-05-09
HDOJ2017_字符串统计
2021-05-09