hdu 5256

思路:貌似题目就是思路,要一个序列修改最少的个数使其变得严格递增,对于a[i]-a[j]>=i-j,(i>j),那么对于a[i],变成a[i]-i,再求最长递增子序列,n-去

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+10;
 4
 5 int a[N];
 6 int b[N];
 7 int n;
 8
 9 int search(int x,int L,int R){
10    // cout<<x<<" "<<L<<" "<<R<<endl;
11     int y=x,l=L,r=R,mid,ans;
12     while(l<=r){
13         mid=(l+r)>>1;
14       //  cout<<mid<<endl
15         if(b[mid]>x){
16             ans=mid;
17             r=mid-1;
18         }
19         else l=mid+1;
20     }
21     return ans;
22 }
23 int hh(){
24     b[1]=a[1];
25     int len=1;
26     for(int i=2;i<=n;i++){
27         if(a[i]>=b[len]){
28             len++;
29             b[len]=a[i];
30         }
31         else {
32             int k=search(a[i],1,len);
33            //cout<<endl;
34             b[k]=a[i];
35         }
36     }
37     return len;
38 }
39
40 int main(){
41     int t ;
42     int kk=1;
43
44     scanf("%d",&t);
45     while(t--){
46         scanf("%d",&n);
47         for(int i=1;i<=n;i++) {
48             scanf("%d",&a[i]);a[i]-=i;
49         }
50         printf("Case #%d:\n%d\n",kk++,n-hh());
51     }
52     return 0;
53 }
54 /*
55 5
56 5
57 0 1 1 2 3
58 */

题目不是说每个都是正整数嘛

时间: 2024-07-31 23:10:52

hdu 5256的相关文章

序列变换 HDU - 5256

序列变换 HDU - 5256 题目链接 题目 我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多少个元素. input 第一行输入一个T(1≤T≤10),表示有多少组数据 每一组数据: 第一行输入一个N(1≤N≤105),表示数列的长度 第二行输入N个数A1,A2,...,An. 每一个数列中的元素都是正整数而且不超过106. output 对于每组数据,先输出一行 Case #i:

hdu 5256 序列变换(LIS最长上升子序列)

Problem Description 我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多少个元素. Input 第一行输入一个T(1≤T≤10),表示有多少组数据 每一组数据: 第一行输入一个N(1≤N≤105),表示数列的长度 第二行输入N个数A1,A2,...,An. 每一个数列中的元素都是正整数而且不超过106. Output 对于每组数据,先输出一行 Case #i: 然后输出

hdu 5256 序列变换

最长上升子序列 nlogn;也是从别人的博客学来的 #include<iostream> #include<algorithm> #define maxn 100000+5 using namespace std; int n; int a[maxn]; int solve(int b[],int l) { int f[maxn];//f[i]表示子序列长度为i+1的序列中,末尾元素最小的元素的值 int k=0; f[k++]=b[0]; for(int i=1;i<l;i

hdu 5256 序列变换 (LIS变形)

序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 519    Accepted Submission(s): 245 Problem Description 我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多少个元素.

hdu 5256 最少修改多少个数 能使原数列严格递增

Problem Description我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多少个元素.Input第一行输入一个T(1≤T≤10),表示有多少组数据 每一组数据: 第一行输入一个N(1≤N≤105),表示数列的长度 第二行输入N个数A1,A2,...,An. 每一个数列中的元素都是正整数而且不超过106.Output对于每组数据,先输出一行 Case #i: 然后输出最少需要修

hdu 5256 LIS变形

给一个数列,问最少修改多少个元素使数列严格递增.如果不是要求“严格”递增,那就是求最长不降子序列LIS,然后n-LIS就是答案.要严格递增也好办,输入的时候用每个数减去其下标处理一下就行了. /* * Author : ben */ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <iostr

2015 百度之星初赛 1 2 2015ACM/ICPC亚洲区上海站 codeforces 851

A - 超级赛亚ACMer HDU - 5246 n m k m >=max( a[i] ); m < min(a[i]); 先判断掉 然后就可以找到最接近的 比m小的一个数 往上涨 看是否能行 O(n) #include<stdio.h> #include<string.h> #include<algorithm> #include<string> #include<iostream> #include<math.h>

最长上升子序列 和 最长不下降子序列

最长上升子序列:是严格上升的,a<b<c<d这样的,即为严格单调递增,用lower_bound lower_bound:返回序列中大于等于key值的第一个数 比如说序列 1 2 3 4 5,key值为3,使用lower_bound返回第三个数 最长不下降子序列:不是严格上升,可以存在多个数相等的情况,用upper_bound upper_bound:返回序列中严格大于key值的第一个数 比如说序列1 2 3 4 5,key值为3,使用upper_bound返回第四个数 Hdu 1950

【HDU】5256 序列变换(最长上升子序列变形)

如果a[i]和a[j]想不变,需要满足的条件就是 a[j] - a[i] > j - i 也就是a[i] - i < a[j] - j 比如1 4 2 就不满足,所以1和2之间一定有一个需要改变 所以我们对所有a[i] - i求其最长上升子序列就可以了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100005; con