https://codeforces.com/contest/1407/problem/D

mdA题没做出来,吧D过了以后一看cf predictor竟然还能上分,刷牙的时候想着不会fst哪题吧?回来一看这题fst了我透,日常优化常数把人剪没了。

可以发现,我们如果要从i跳到j,那么假设我们当前在i,如果a[i+1]>a[i],那么只能按照一个严格下降子序列转移,否则则是按照一个严格上升子序列转移,

所以用树状数组预处理出每个位置右边离它最近的比他大的nxtup[i]和比他小的nxtd[i],然后一直向右判断能否转移就行了,如果还没更新过或者不如当前转移优就能转移。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;const int maxl=3e5+10;int n,m,cnt,tot,cas,ans;
int a[maxl],dp[maxl],num[maxl];
int b[maxl],nxtup[maxl],nxtd[maxl];
char s[maxl];inline void upd(int i,int x)
{while(i<=tot){b[i]=min(x,b[i]);i+=i&-i;}
}inline int qry(int i)
{int ret=n+1;while(i){ret=min(ret,b[i]);i-=i&-i;}return ret;
}inline void prework()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]),num[i]=a[i];sort(num+1,num+1+n);tot=unique(num+1,num+1+n)-num-1;for(int i=1;i<=n;i++)a[i]=lower_bound(num+1,num+1+tot,a[i])-num;for(int i=0;i<=tot;i++)b[i]=n+1;int c;for(int i=n;i>=1;i--){c=a[i];nxtd[i]=qry(c-1);upd(c,i);}for(int i=0;i<=tot;i++)b[i]=n+1;for(int i=n;i>=1;i--){c=tot-a[i]+1;nxtup[i]=qry(c-1);upd(c,i);}
}inline void mainwork()
{dp[1]=0;int now,last;for(int i=2;i<=n;i++)dp[i]=n-1;for(int i=1;i<=n-1;i++){dp[i+1]=min(dp[i+1],dp[i]+1);if(a[i+1]>a[i]){now=i+1;while(nxtd[now]<=n){last=now;now=nxtd[now];if(dp[now]<=dp[i]+1 || a[last]<=a[i])break;dp[now]=min(dp[now],dp[i]+1);}}if(a[i+1]<a[i]){now=i+1;while(nxtup[now]<=n){last=now;now=nxtup[now];if(dp[now]<=dp[i]+1 || a[last]>=a[i])break;dp[now]=min(dp[now],dp[i]+1);}}}
}inline void print()
{printf("%d\n",dp[n]);
}int main()
{int t=1;//scanf("%d",&t);for(cas=1;cas<=t;cas++){prework();mainwork();print();}return 0;
}

codeforces1407D Discrete Centrifugal Jumps相关推荐

  1. CF1407D Discrete Centrifugal Jumps(单调队列+DP)

    整理的算法模板合集: ACM模板 目录 第二个方式维护单减 第三个方式维护单增 while(utop && a[i] <= a[stk_up[utop]]) {if(a[i] ! ...

  2. CodeForces - 1407D Discrete Centrifugal Jumps(单调栈+dp)

    题目链接:点击查看 题目大意:给出 n 个大楼的高度记为 h,现在需要从第一个大楼到达第 n 个大楼,问最小步数是多少,只有满足以下条件时才能从 i 移动到 j ,设 i < j: 题目分析:无 ...

  3. CF #669 (Div. 2)D. Discrete Centrifugal Jumps(线段树/单调队列优化dp)

    https://codeforces.com/contest/1407/problem/D 题意:给定n个高度,当i<ji<ji<j且满足以下条件之一时,可以从iii跳到jjj: 问 ...

  4. Codeforces Round #669 (Div. 2)

    那天晚上和同学打球打的有点晚,结果就鸽了,现在来补一下 A - Ahahahahahahahaha 直接看原数组中0的个数cnt0和1的个数cnt1,谁多留谁即可,注意留1的时候要留偶数个. #def ...

  5. 组合保险策略及相应模拟测算工具----Discrete Hedging: Guaranteed CPPI Structures

    组合保险策略及相应模拟测算工具----Discrete Hedging: Guaranteed CPPI Structures 最近将 open code 稍作修改  做了一个CPPI模拟测算工具,h ...

  6. Error: Discrete value supplied to continuous scale

    Error: Discrete value supplied to continuous scale 目录 Error: Discrete value supplied to continuous s ...

  7. R语言问题解决:Error: Discrete value supplied to continuous scale

    R语言问题解决:Error: Discrete value supplied to continuous scale #仿真数据 set.seed(123) my_df1 <- data.fra ...

  8. ERROR while rich displaying an object: Error: Continuous value supplied to discrete scale

    ERROR while rich displaying an object: Error: Continuous value supplied to discrete scale 目录 ERROR w ...

  9. Discrete Fourier Transform离散傅里叶变换算法

    DFT 公式: Ak=∑n=0N−1e−i2πNknan,k∈{0,1,...N−1}A_k = \sum_{n=0}^{N-1}e^{-i\frac{2\pi}{N}kn}a_n , k\in \{ ...

最新文章

  1. leveldb源码分析:数据插入续(跳表)
  2. python遍历excel_python遍历文件读取并写结果到excel
  3. 位运算实现一些小算法
  4. 黑客攻防专题八:21种RING的提权方法
  5. WPF跨程序集共享样式(跨程序集隔离样式和代码)
  6. MySQL配置文件简单解析
  7. Java区间拆分子集求和,对列表中的数字子集求和
  8. 【大数据部落】基于LDA主题模型聚类的商品评论文本挖掘
  9. fedora linux五笔输入法,Fedora 22上安装fcitx五笔输入法
  10. python pytz模块_python pytz
  11. 显卡对决nbsp;NVIDIAnbsp;GTnbsp;555Mnbsp;VS…
  12. 百度暑期前端实训DAY1心得
  13. 网站收录提交入口,主动出击加快网站收录
  14. luogu1359 租用游艇
  15. 接口区分Android和iOS吗,区分IOS和Android
  16. C语言入门教程|| C语言 程序结构|| C语言 基本语法
  17. Android 6.0 Phone 多方通话流程
  18. netCDF文件的scale_factor和add_offset
  19. 多线程编程核心技术总结(读周志明书籍的总结)
  20. 买外链,seo发外链,外链发布平台有哪些?

热门文章

  1. Ubuntu 20.04桌面版 安装antlr4的C++ runtime library(运行时库)
  2. Java 调用CMD 命令
  3. 「尚硅谷与腾讯云官方合作」硅谷课堂项目视频发布
  4. 仿糖护士曲线图写的一个CurveChartView
  5. mysql查看某一库的collae,2021年智慧职教MySQL数据库应用单元测试答案
  6. Spring容器加载时执行自定义的方法
  7. 51单片机播放音乐(三):PWM播放任意波形
  8. 成都黑马java怎么样_成都黑马JavaEE02期——我的黑马之旅
  9. UG4.0 57套经典塑胶模具结构设计视频教程 全3D结构设计
  10. 每个Java类都有的toString方法