Codeforces Round #FF (Div. 2) C. DZY Loves Sequences

解题报告:输入一个数列,选取一个子数列,要求最多只能改动这个子数列中的一个数,使得这个子数列是严格的升序的(严格升序没有相等的)

我的做法是,第一步把这个 数列的每个升序的子数列都找出来,然后看这些子数列能不能和跟它相邻的升序的子数列连接起来。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxn = 100000+5;
 8 typedef __int64 INT;
 9 INT que[maxn];
10 struct node
11 {
12     int f,r,l;
13 }da[maxn];
14 
15 int main()
16 {
17     int n;
18     while(scanf("%d",&n)!=EOF)
19     {
20         for(int i = 0;i < n;++i)
21         scanf("%I64d",&que[i]);
22         INT f = 0,temp = que[0],s = 0;
23         que[n] = -0x7ffffffff;
24         for(int i = 0;i < n;++i)
25         if(que[i] >= que[i + 1])
26         {
27             da[f].f = s;
28             da[f].r = i;
29             da[f].l = da[f].r - da[f].f + 1;
30             s = i+1;
31             f++;
32         }
33     //    for(int i = 0;i < f;++i)
34     //    printf("%d %d %d\n",da[i].f,da[i].r,da[i].l);
35         int ans = 0;
36         for(int i = 0;i < f - 1;++i)
37         {
38             ans = max(ans,da[i].l);
39             if(f > 1)
40             ans = max(ans,da[i].l + 1);
41             if(da[i].l > 1 && que[da[i].r - 1] < que[da[i+1].f] - 1)
42             ans = max(ans,da[i].l + da[i+1].l);
43             if(da[i+1].l > 1 && que[da[i].r] < que[da[i+1].f + 1] - 1)
44             ans = max(ans,da[i].l + da[i+1].l);
45         }
46         if(f ==  1)
47         ans = da[0].l;
48         if(f > 1)
49         ans = max(ans,da[f-1].l+1);
50         printf("%d\n",ans);
51     }
52     return 0;
53 }
View Code

 

posted @ 2014-07-15 10:22  xiaxiaosheng  阅读(173)  评论(0编辑  收藏  举报