Codeforces Round #407 C

C. Functions again

题意:给你一个数列,求函数f(l,r) 的最大值 函数f(l,r)的定义如下

思路:求出新的的数列 ci=|ai-ai+1| f(l,r)即为l到r-1的和 并分奇偶分别计算最大连续子列和

AC代码:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#define ll long long
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int N=1e5+100;
int a[N],b[N],c[N];
int main(){
    int n;
    cin>>n;
    for(int i=1; i<=n; ++i){
        scanf("%d",a+i);
    }
    for(int i=1; i<n; ++i){
        b[i]=abs(a[i]-a[i+1]);
        c[i]=b[i];
        if(i&1) b[i]*=-1;
        else c[i]*=-1;
    } //for(int i=1; i<n; ++i) cout<<b[i]<<" ";cout<<"\n";for(int i=1; i<n; ++i) cout<<c[i]<<" ";cout<<"\n";
    ll tmp=0,ans=0;
    for(int i=2; i<n; ++i){
        tmp+=b[i];
        ans=max(tmp,ans);
        if(tmp<0){
            tmp=0;
        }
    }
    tmp=0;
    for(int i=1; i<n; ++i){
        tmp+=c[i];
        ans=max(tmp,ans);
        if(tmp<0){
            tmp=0;
        }
    }
    cout<<ans<<endl;
    return 0;
}
时间: 2024-10-13 17:50:02

Codeforces Round #407 C的相关文章

Codeforces Round #407 (Div. 2) C Functions again(最大子序列和)

Something happened in Uzhlyandia again... There are riots on the streets... Famous Uzhlyandian superheroes Shean the Sheep and Stas the Giraffe were called in order to save the situation. Upon the arriving, they found that citizens are worried about

Codeforces Round #407 (Div. 2)(争取明天24点前补掉)

A - Anastasia and pebbles(水题) 题意: 一个人有俩口袋,每个口袋最多装k个,然后每天每个口袋里的石头颜色必须都相同,问你最少用几天能装完. 思路: 水题..一不小心写瓷了,以为A题大水题,瞎写也不会T,没仔细想..写了一个T的代码. 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n, k; 6 cin >> n >> k; 7 vector&l

Codeforces Round #407 (Div. 2)解题报告

好遗憾没参加这场比赛--vp取得了目前最高的名次orz A. Anastasia and pebbles 向上取整处理即可. 1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 typedef long long ll; 8 typed

Codeforces Round #407 (Div. 2)

A 模拟 B 大力分类讨论 |b1|?>?l - answer is 0. b1?=?0 - if 0 is present in array a than answer is 0, else inf. q?=?1 - if b1 is present in array a than answer is 0, else inf. q?=??-?1 - if both b1 and ?-?b1 are present in array a than answer is 0, otherwise i

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我