C2. Increasing Subsequence (hard version)
思路:
分为4种情况,最难的就是(pre表示上一个进入队列的元素)a[i]>pre&&a[j]>pre&&a[i]==a[j]的情况,
可以分为两种情况,先选取a[i],然后向后遍历得到字符串s1,
或者选取a[j]先前遍历得到字符串s2,然后选取字符串较长的那个。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 3e5+10;
int que[maxn],a[maxn];
int main(void)
{
int n,i,x;
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
string ss = "";
int pre = 0,l = 1,r = n;
while(l<r){
if(a[l]>pre&&a[r]>pre){
if(a[l]<a[r]){
ss+="L";pre = a[l];l++;
}
else if(a[l]>a[r]){
ss+="R";pre = a[r],r--;
}
else if(a[l]==a[r]){
string tl,tr;
int lpre = pre,left = l;
while(left<r&&a[left]>lpre){
tl+="L";
lpre = a[left++];
}
int rpre = pre,right = r;
while(right>l&&a[right]>rpre){
tr+="R";
rpre = a[right--];
}
if(tr.length()<tl.length()) ss+=tl,pre = lpre,l = left;
else ss+=tr,pre = rpre,r = right;
}
}
else if(a[l]>pre&&a[r]<=pre){
ss+="L";pre = a[l];l++;
}
else if(a[r]>pre&&a[l]<=pre){
ss+="R";pre = a[r];r--;
}
else break;
}
if(l==r&&pre<a[l]) ss+="R";
cout<<ss.length()<<endl<<ss<<endl;
return 0;
}