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

  • 时间: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. }

来自为知笔记(Wiz)

时间: 2024-12-28 14:03:28

[2016-04-13][codeforces][447][C][DZY Loves Sequences]的相关文章

Codeforces 447 C DZY Loves Sequences【DP】

题意:给出一列数,在这个序列里面找到一个连续的严格上升的子串,现在可以任意修改序列里面的一个数,问得到的子串最长是多少 看的题解,自己没有想出来 假设修改的是a[i],那么有三种情况, 1.a[i]>a[i-1],那么求出向左能够延伸的最长的长度 2.a[i]<a[i-1],那么求出向右能够延伸的最长的长度 3.如果修改的这个数刚好夹在两个数的中间,这种情况比上面两种都优, 即为a[i-1]<a[i+1]-1,求出左右能够延伸的最长的长度 然后因为a[i]本身还没有算进去,所以求出最大值

[2016-04-13][codeforces][447][B][DZY Loves Strings]

时间:2016-04-13 23:36:46 星期三 题目编号:[2016-04-13][codeforces][447][B][DZY Loves Strings] 题目大意:已知每个字母的权值,给定一个字符串s,问,插入k个字母进入字符串s之和,最多能得到多大的权值 分析:直接往s后面插入k个权值最大的字母 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char

[2016-04-13][codeforces][447][A][DZY Loves Hash]

[2016-04-13][codeforces][447][A][DZY Loves Hash].md 时间:2016-04-13 23:35:11 星期三 题目编号:[2016-04-13][codeforces][447][A][DZY Loves Hash] 题目大意:问hash是否冲突 分析:模拟一遍即可 #include<cstdio> #include<cstring> using namespace std; const int maxn = 300 + 10; in

codeforces#FF(div2) DZY Loves Sequences

n个数,可以任意改变其中一个数,求最长的上升子区间长度 思路:记录一个from[i]表示从位置i的数开始最长的上升区间长度 记录一个to[i]表示到位置i的数所能达到的最长上升区间长度 枚举要改变的数的位置i,此时能达到的长度为to[i - 1] + from[i + 1] + 1,取最大值 //#pragma comment(linker, "/STACK:102400000,102400000") //HEAD #include <cstdio> #include &l

[CodeForces - 447C] C - DZY Loves Sequences

C - DZY Loves Sequences DZY has a sequence a, consisting of n integers. We'll call a sequence ai,?ai?+?1,?...,?aj (1?≤?i?≤?j?≤?n) a subsegment of the sequence a. The value (j?-?i?+?1) denotes the length of the subsegment. Your task is to find the lon

Codeforces Round #254 DZY Loves Colors

题意:输入n, m ; 有n给位置, 初始时第i个位置的color为i, colorfulness为0. 有m次操作,一种是把成段的区域color更新为x, 对于更新的区域,每个位置(令第i个位置未更新前颜色为color[i])的colorfulness增加|color[i] -x|; 另一种操作是询问一段区间[L,R]输出该区间的colorfulness总和. 1 #include <iostream> 2 #include <cstdio> 3 #include <cst

Codeforces Round #FF(255) C. DZY Loves Sequences (LIS升级)

题目:C. DZY Loves Sequences (LIS升级) 题意: 在n个数中,最多改变一个数字,并求能够达到的最长严格上升子序列(连续)长度 分析: 考虑第i个数,能否改变后拼接前后两个字串,并维护当前最大值 状态: left[i]:  表示以i为终点的最长严格上升子序列长度 right[i]: 表示以i为起点的最长严格上升子序列长度 dp[i]:   表示改变第i个数后,拼接前后字串的长度 转移方程:       dp[i] = max{left[i-1] + right[i+1] 

codeforces 444 C. DZY Loves Colors(线段树)

题目大意: 1 l r x操作 讲 [l,r]上的节点涂成x颜色,并且每个节点的值都加上 |y-x| y为涂之前的颜色 2 l r  操作,求出[l,r]上的和. 思路分析: 如果一个区间为相同的颜色.那么我们才可以合并操作. 所以我们之前找相同的区间就好. 但是问题是如何合并操作. 那么我们定义一个val  表示这个区间每个位置上应该加上的值. pushdown 的时候这个值是可以相加的. #include <cstdio> #include <iostream> #includ

Codeforces Round #FF(255) DIV2 C - DZY Loves Sequences

A - DZY Loves Hash 水题,开辟一个数组即可 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; int main(){ int p,n; cin >> p >> n; vector<bool> buckets(302,false); bool flag = fal