一 题面
C2. Increasing Subsequence (hard version)
二 分析
需要思考清楚再写的一个题目,不能一看题目就上手,容易写错。
分以下几种情况:
1 左右两端数都小于等于构造的数组的最后一个数字
2 左右两端数至少有一个大于构造的数组最后一个数字
a. 左右两端数字相等,肯定满足上面条件。那么只可能走一个方向,两边都模拟一下,比一下大小即可
b. 左右两端数字不等,则优先看谁满足上面2的情况,若都满足则选最小的
三 AC代码
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int MAXN = 2e5 + 15; 6 int N, Data[MAXN]; 7 int Ans, ansOP[MAXN]; 8 9 int fun_l(int L, int R, int tmp) 10 { 11 int res = 0; 12 while(Data[L] > tmp && L <= R) 13 { 14 res++; 15 tmp = Data[L++]; 16 } 17 return res; 18 } 19 20 int fun_r(int L, int R, int tmp) 21 { 22 int res = 0; 23 while(Data[R] > tmp && R >= L) 24 { 25 res++; 26 tmp = Data[R--]; 27 } 28 return res; 29 } 30 31 void solve() 32 { 33 int L = 0, R = N - 1, tmp = 0; 34 while(L <= R) 35 { 36 if( max(Data[L], Data[R]) <= tmp) 37 { 38 break; 39 } 40 if(Data[L] == Data[R]) 41 { 42 int ansl = fun_l(L, R, tmp); 43 int ansr = fun_r(L, R, tmp); 44 if(ansl > ansr) 45 { 46 for(int j = 0; j < ansl; j++) 47 ansOP[Ans++] = 0; 48 } 49 else 50 { 51 for(int j = 0; j < ansr; j++) 52 ansOP[Ans++] = 1; 53 } 54 break; 55 } 56 else if(Data[L] < Data[R]) 57 { 58 if(Data[L] > tmp) 59 { 60 tmp = Data[L++]; 61 ansOP[Ans++] = 0; 62 } 63 else 64 { 65 tmp = Data[R--]; 66 ansOP[Ans++] = 1; 67 } 68 } 69 else 70 { 71 if(Data[R] > tmp) 72 { 73 tmp = Data[R--]; 74 ansOP[Ans++] = 1; 75 } 76 else 77 { 78 tmp = Data[L++]; 79 ansOP[Ans++] = 0; 80 } 81 } 82 } 83 } 84 85 86 int main() 87 { 88 //freopen("input.txt", "r", stdin); 89 while(~scanf("%d", &N)) 90 { 91 for(int i = 0; i < N; i++) 92 scanf("%d", &Data[i]); 93 solve(); 94 printf("%d\n", Ans); 95 for(int i = 0; i < Ans; i++) 96 { 97 if(ansOP[i] == 0) 98 printf("L"); 99 else 100 printf("R"); 101 } 102 printf("\n"); 103 } 104 return 0; 105 }