hdu 6197 array array array
https://vjudge.net/contest/184514#problem/D
题意:
给出一个数组和一个数字k,问去掉k个数字之后这个数列能否非递增或者非递减。
思路:
智障了,这种应该一眼就看出来嘛,还去求逆序数。。。求一遍最长不下降子序列和最长不上升子序列,只要数组的长度减去其中任何一个小于等于k的话,那么就说明去掉k个数就肯定满足题中的一个条件。
nlogn的LIS。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 int a[100005]; 7 int b[100005]; 8 int c[100005]; 9 10 int main() 11 { 12 int t; 13 14 scanf("%d",&t); 15 16 while (t--) 17 { 18 int n,k; 19 20 scanf("%d%d",&n,&k); 21 22 for (int i = 0;i < n;i++) 23 { 24 scanf("%d",&a[i]); 25 } 26 27 b[0] = a[0]; 28 29 int cnt1 = 1; 30 31 for (int i = 1;i <= n;i++) 32 { 33 if (a[i] > b[cnt1-1]) b[cnt1++] = a[i]; 34 else 35 { 36 int pos = lower_bound(b,b+cnt1,a[i]) - b; 37 b[pos] = a[i]; 38 } 39 } 40 41 int cnt2 = 1; 42 43 for (int i = 0;i < n;i++) 44 { 45 b[n - i - 1] = a[i]; 46 } 47 48 c[0] = b[0]; 49 50 for (int i = 1;i < n;i++) 51 { 52 if (b[i] > c[cnt2-1]) c[cnt2++] = b[i]; 53 else 54 { 55 int pos = lower_bound(c,c+cnt2,b[i]) - c; 56 c[pos] = b[i]; 57 } 58 } 59 60 //printf("%d %d\n",cnt1,cnt2); 61 62 if (n - cnt1 <= k || n - cnt2 <= k) printf("A is a magic array.\n"); 63 else printf("A is not a magic array.\n"); 64 } 65 66 return 0; 67 }
康复训练中~欢迎交流!