码迷,mamicode.com
首页 > 其他好文 > 详细

套题整理 Orz DXY

时间:2016-08-28 13:42:44      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:

弱弱的DXY

 

题目描述

DXY太弱了,以至于他已经不知道要如何解决调整一个数列的使得他变成一个严格上升序列。

输入格式

第 1 行,1 个整数 N

第 2 行,N 个整数 A1,A2,...,AN

输出格式

1 个整数,表示最少需要修改的多少个数字,使得数列变成单调上升的序列。

样例输入

3

1 3 2

样例输出

1

数据:

对于50%的数据:N<=1000

对于100%的数据:N<=100000

保证所有输入整数<=2^63-1


 由于数据比较弱所以可以直接写成最长上升子序列然后n-f[n]骗骗分(大雾)

正解的话是把位置i上的数字减去i,做不下降子序列就好了,不过普通dp会T要找nlogn的做法QAQ

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #define LiangJiaJun main
 8 #define INF 1999122700
 9 using namespace std;
10 int a[100004];
11 int unset[100004],n;
12 int cnt=0;
13 int erfen(int x){
14     int l=0,r=n,ans=0;
15     while(l<=r){
16         int mid = (l+r) >> 1;
17         if(unset[mid]>x)r=mid-1;
18         else{
19             ans = mid;
20             l = mid + 1;
21         }
22     }
23     return ans;
24 }
25 int LiangJiaJun(){
26     freopen("loser.in","r",stdin);freopen("loser.out","w",stdout);
27     scanf("%d",&n);
28     for(int i=1;i<=n;i++){
29         scanf("%d",&a[i]);
30         a[i]-=i;
31     }
32     for(int i=0;i<=n+1;i++)unset[i]=INF;
33     unset[1]=a[1];unset[0]=-INF;
34     for(int i=2;i<=n;i++){
35         int x=erfen(a[i])+1;
36         unset[x]=min(a[i],unset[x]);
37     }
38     for(int i=1;i<=n;i++)if(unset[i]!=INF)cnt=i;
39     cout<<n-cnt<<endl;
40     fclose(stdin);fclose(stdout);
41     return 0;
42 }

 hint:

不减i的话你看看这个数据1   2   3  2   2       2    2    4     5
减去i如果是不下降就说明那些在不下降序列上的数已经符合他们在数列中的位置,不需要修改了 

套题整理 Orz DXY

标签:

原文地址:http://www.cnblogs.com/radiumlrb/p/5814774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!