Codeforces Round #555 div3 C2

题目大意

给出一个序列,可以从左或从右侧取数,要求取出的序列严格上升

思路

贪心取左右最小的,如果相等则之后只能从一侧取,直接选能取最长的一侧

Code:

 #include<bits/stdc++.h> 

#define ll long long 

#define inf 0x3f3f3f3f
using namespace std; 

int ma[10];
int n;
int a[(int)(2*1e5)+10];

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    int cmin = 0;
    int l = 1,r=n;
    vector<int> ans;
    while(l<=r && cmin<max(a[l],a[r])){
        if(a[l]==a[r]){
            if(r-l<3){
                ans.push_back(0);
                cmin = a[l++];
            }
            else{
                int cntl=0,cntr=0;
                int ind = l+1;
                while(a[ind]>a[ind-1]) cntl++,ind++;    //左边可取的长度
                ind = r-1;
                while(a[ind]>a[ind+1]) cntr++,ind--;    //右边可取的长度
                if(cntl>cntr){
                    ans.push_back(0);
                    cmin = a[l++];
                }else{
                    ans.push_back(1);
                    cmin = a[r--];
                }
            }
            continue;
        } 
        // cmin<a[l]<a[r] 或 a[r] < cmin < a[l]
        if((a[l]<a[r] && cmin<a[l] )|| cmin>=a[r]){
            ans.push_back(0);
            cmin = a[l++];
        }else{  // cmin < a[r] < a[l] 或 a[l] < cmin < a[r]
            ans.push_back(1);
            cmin = a[r--];
        }
    }
    printf("%d\n",ans.size());
    for(int i:ans){
        if(i==0)printf("L");
        else printf("R");
    }
    printf("\n");
    return 0;
}
} 

猜你喜欢

转载自www.cnblogs.com/xxrlz/p/10777436.html