标签:return com log bsp sequence 个数 题意 force ace
题目链接:http://codeforces.com/problemset/problem/1144/G
这个题和另外一个题非常相似,但是另外一个题比这个简单许多,有兴趣可以一起做一做。有题目和思路:https://www.cnblogs.com/xlbfxx/p/11255419.html
题意:将一个序列按顺序分为两个序列,一个严格递增,一个严格递减。空序列或者一个元素的序列可以作为递增或递减。
思路:
设置两个序列,一个递增,一个递减,遍历输入的序列,这个数和序列末尾的数比较
1.如果这个数只能放入递增序列,就放入递增序列。
2.如果这个数只能放入递减序列,就放入递减序列。
3.如果这个数能放入两个序列,就将这个数和它后面的数比较。
(1)如果大于后面的数,就放入递减序列。
(2)如果小于后面的数,就放入递增序列。
(3)如果相等,就分别放入两个序列。
为什么这样是对的呢?当这个数能放入两个序列时,它小于后面的数,如果后面的数是递增序列的,那这个数有没有都无所谓的,如果这个数放入递减序列,后面有可能又大于它的数想放入递减序列,但受到了这个数的限制,比如5 3 8 4,对于3这个数,它可以放入两个序列,它小于8,如果它放入递减序列,就限制了后面的4。
在我做这个题的时候,想错了一种情况,就是当序列就1个数的时候,我觉得它没办法分成两个序列,其实可以分成两个序列,一个序列一个数字,一个序列为空,都可以是递增或者递减。
AC代码:
#include<iostream> using namespace std; const int MAX=2e5+10; int a[MAX],b[MAX]; int main() { int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; int pre1=-1,pre2=MAX; //pre1是递增序列最后一个值,pre2是递减序列最后一个值 for(int i=0;i<n;i++) { if(a[i]>pre1&&a[i]<pre2) { if(i==n-1) { b[i]=0; }else{ if(a[i]<a[i+1]){ b[i]=0; pre1=a[i]; }else if(a[i]>a[i+1]){ b[i]=1; pre2=a[i]; }else{ b[i]=0; b[i+1]=1; pre1=a[i]; pre2=a[i]; i++; } } }else if(a[i]>pre1){ pre1=a[i]; b[i]=0; }else if(a[i]<pre2){ pre2=a[i]; b[i]=1; }else{ cout<<"NO"<<endl; return 0; } } cout<<"YES"<<endl; for(int i=0;i<n;i++)cout<<b[i]<<" "; return 0; }
标签:return com log bsp sequence 个数 题意 force ace
原文地址:https://www.cnblogs.com/xlbfxx/p/11270050.html