Codeforces Round #258 (Div. 2) B. Sort the Array

冷不防 2024-03-29 14:53 156阅读 0赞

Problem - B - Codeforces

题意:

给定一个数列,问你能否把其一段子段反转之后使其单调递增

思路:

结论很简单,当且仅当数列中只有一段单调递减的子段且反转之后能单调递增

重点在于我们怎么去写它

像这种关注数列单调性的有种很方便的写法

创建一个和a一样的数组,然后排序,把这两个数列对比一下就行

详细看代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int mxn=1e5+10;
  5. int n,ok=1;
  6. int a[mxn],b[mxn];
  7. signed main(){
  8. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  9. cin>>n;
  10. for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
  11. sort(b+1,b+1+n);
  12. ok=1;
  13. for(int i=1;i<=n;i++){
  14. if(a[i]!=b[i]) ok=0;
  15. }
  16. if(ok){
  17. cout<<"yes"<<'\n';
  18. cout<<"1 1"<<'\n';
  19. return 0;
  20. }
  21. int l,r;
  22. for(int i=1;i<=n;i++){
  23. if(a[i]!=b[i]){
  24. l=i;
  25. break;
  26. }
  27. }
  28. for(int i=n;i>=1;i--){
  29. if(a[i]!=b[i]){
  30. r=i;
  31. break;
  32. }
  33. }
  34. reverse(a+l,a+1+r);
  35. ok=1;
  36. for(int i=1;i<=n;i++){
  37. if(a[i]!=b[i]) ok=0;
  38. }
  39. if(ok){
  40. cout<<"yes"<<'\n';
  41. cout<<l<<" "<<r<<'\n';
  42. }else cout<<"no"<<'\n';
  43. }

发表评论

表情:
评论列表 (有 0 条评论,156人围观)

还没有评论,来说两句吧...

相关阅读