码迷,mamicode.com
首页 > 其他好文 > 详细

[2016-04-13][codeforces][447][C][DZY Loves Sequences]

时间:2016-04-14 01:09:10      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

  • 时间:2016-04-13 23:39:47 星期三

  • 题目编号:[2016-04-13][codeforces][447][C][DZY Loves Sequences]

  • 题目大意:给定一串数字,问改变其中一个数字之和,最长能得到多长的严格增加的子串

  • 分析:

    • 维护每个数字往左和往右能延续多长(严格减,增),然后枚举每个点,
      • 如果这个点已经在一个严格增加的序列中,那么ans =min(n, max(ans , l[i] + r[i] + 1)) 即左右两边延伸之后,改变后面非递增的一个数字
        • 注意这种情况,i位置的数字两边必须相差1,这样i才有的改
      • 如果这个点不在一个严格递增的序列中,那么就更改这个值
  1. //实现和上面讲得有点差异,但是原理一样
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn = 1E5 + 10;
  6. int a[maxn],b[maxn],c[maxn],n;
  7. int main(){
  8. scanf("%d",&n);
  9. for(int i = 1 ; i <= n ; ++i){
  10. scanf("%d",&a[i]);
  11. }
  12. b[1] = 1;
  13. for(int i = 2 ; i <= n ; ++i){
  14. if(a[i] > a[i - 1]) b[i] = b[i - 1] + 1;
  15. else b[i] = 1;
  16. }
  17. c[n] = 1;
  18. for(int i = n ; i >= 2 ; --i){
  19. if(a[i] > a[i - 1]) c[i - 1] = c[i] + 1;
  20. else c[i - 1] = 1;
  21. }
  22. int ans = c[1]+1;
  23. for(int i = 2 ; i < n ; ++i){
  24. if(a[i - 1] < a[i] && a[i] < a[i + 1]){
  25. ans = min(n,max(ans,b[i] + c[i]) );
  26. }
  27. if(a[i - 1] + 1 < a[i + 1])
  28. ans = max(ans , b[i - 1] + c[i + 1] + 1);
  29. }
  30. ans = min(n,max(ans,b[n]+1));
  31. printf("%d\n",ans);
  32. return 0;
  33. }




[2016-04-13][codeforces][447][C][DZY Loves Sequences]

标签:

原文地址:http://www.cnblogs.com/qhy285571052/p/790caea5d448a73bb240c7c81dcac87f.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!