E. Make It Increasing

首先让ai=ai−ia_i=a_i-iai​=ai​−i这样可以是严格单增变成单调增。
参考官方题解
首先不难得出如果我们根据不同修改的位置分割成若干段,那么若干段是互不影响的,我们只需要求出每一个若干段修改次数的最小值。

如果当前考虑l~r这一段,这里l和r都是不能修改的位置,我们要使得al≤al+1→r−1≤ara_l\leq a_{l+1\to r-1}\leq a_ral​≤al+1→r−1​≤ar​,对于原来不在此范围内的数一定需要修改,所以只需要考虑在此范围内的数如何修改的最少!实际上是选择最长的上升子序列,剩下的修改即可。而最长上升子序列我们可以O(nlogn)解决。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<random>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=500010;
int a[N],b[N],n,k;
int main()
{IO;int T=1;//cin>>T;while(T--){cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) cin>>b[i];a[0]=-1e9,a[n+1]=2e9;for(int i=0;i<=n+1;i++) a[i]-=i;b[k+1]=n+1;b[0]=0;bool ok=1;int res=0;for(int i=0;i<=k;i++){int l=b[i],r=b[i+1];if(a[l]>a[r]){ok=0;break;}vector<int> lis;for(int j=l+1;j<r;j++)if(a[l]<=a[j]&&a[j]<=a[r]){auto pos=upper_bound(lis.begin(),lis.end(),a[j]);if (pos==lis.end()) lis.push_back(a[j]);else *pos=a[j];//这里会修改值}res+=(r-l-1)-lis.size();}if(!ok) res=-1;cout<<res<<'\n';}return 0;
}

反思:md我知道那个小trick使得严格变成非严格,但是还是没能运用,还是见的太少,没运用这个小trick导致我的判断不合法时尤为困难。

题解中的最长上升子序列代码好简洁,学习了!
贪心,考虑当前的数,那么替换第一个大于它的数并不影响原来维护序列的单调性,而且答案不会更差!
要加油哦~

codeforces1437 E. Make It Increasing——最长上升子序列相关推荐

  1. [Swift]LeetCode673. 最长递增子序列的个数 | Number of Longest Increasing Subsequence

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  2. C++longest increasing subsequence 最长递增子序列的实现之二(附完整源码)

    C++longest increasing subsequence 最长递增子序列的实现 C++longest increasing subsequence 最长递增子序列的的实现完整源码(定义,实现 ...

  3. C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)

    C++longest increasing subsequence 最长递增子序列的实现 C++longest increasing subsequence 最长递增子序列的的实现完整源码(定义,实现 ...

  4. leetcode(300)—— Longest Increasing Subsequence(最长递增子序列)

    参考 Python 解法: 动态规划 -- 最长递增子序列(LIS) 原题位置:Longest Increasing Subsequence | LeetCode OJ 题目的说明: 严格递增: 子序 ...

  5. Leetcode300. Longest Increasing Subsequence最长上升子序列

    给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4. 说 ...

  6. LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)

    题目描述 给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是 ...

  7. 最长上升子序列(Longest increasing subsequence)

    问题描述         对于一串数A={a1a2a3-an},它的子序列为S={s1s2s3-sn},满足{s1<s2<s3<-<sm}.求A的最长子序列的长度. 动态规划法 ...

  8. 300 Longest Increasing Subsequence 最长上升子序列

    给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4.因为可 ...

  9. 最长连续子序列nlogn算法

    最长上升子序列(LIS)长度的O(nlogn)算法 标签: 算法search优化存储 2012-04-18 19:38 14031人阅读 评论(5) 收藏 举报  分类: 资料学习(15)  解题报告 ...

最新文章

  1. Vue.js 源码目录设计(二)
  2. @scheduled注解配置时间_探究 Spring 的定时任务配置
  3. 安卓java增加属性_如何使用Java读取Android属性
  4. 原型、原型对象、构造函数、原型链理解
  5. 2020 年 7 个软件开发趋势
  6. [OC]TableView使用
  7. PyQt4设置窗口左上角的小图标
  8. 演讲|微软全球公共事业部政府行业总经理Mark Day:第四次工业革命的数字红利...
  9. as 运算符 与 where T : class
  10. SCCM2007系列教程之一SCCM2007的安装
  11. 13.4 Shelve模块
  12. BroadcastReceiver启动Service 3.1之后静态注册
  13. 二叉搜索树,就这,就这啊。
  14. dw01均衡电路_电池平衡电路工作原理
  15. 手机usb计算机无法连接,手机usb连不上电脑怎么办实际解决
  16. echarts设置饼图标示线以及标示文字的颜色等相关样式
  17. 物联网挑战赛【从零到一】
  18. 技法の穴をふさぐ:コスト編 --人月単価は案件ごとにバラバラ公表データで相場を知る
  19. zebra扫码枪复位_zebra斑马条码打印机常见问题和解决办法
  20. 黑苹果双系统时间不一致_解决 Windows/macOS 双系统时间不同步问题

热门文章

  1. sequelize模型关联_关于Sequelize连接查询时inlude中model和association的区别详解
  2. ufo帧率测试网站_一加7游戏续航测试 满电开始玩猜猜能玩多久
  3. mysql报4934_mysql-Mariadb语法错误1064(42000)
  4. 图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)
  5. [数据结构-严蔚敏版]P95矩阵压缩-特殊矩阵的存储(对称矩阵,三角矩阵)
  6. [Qt入门]QMainWindow创建
  7. [蓝桥杯][算法提高VIP]聪明的美食家-dp
  8. PTA天梯赛L1-006 连续因子 (20分)
  9. python实现最小二乘法的线性回归_最小二乘法求线性回归的python实现
  10. P4781 【模板】拉格朗日插值