zoukankan      html  css  js  c++  java
  • D. Maximum Sum on Even Positions(翻转1次,求最大偶数位和)

    题:https://codeforces.com/contest/1373/problem/D

    题意:翻转1次,求最大偶数位和

    分析:先把偶数位的值加起来,然后只能翻转一次,那么要是有翻转奇数位的贡献只能是+a[i]-a[i-1]或+a[i]-a[i+1](这是对于翻转的整个子区间来说的),那么只要求贡献区间的最大子段和即可

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    const int M=1e6+6;
    const int inf=0x3f3f3f3f;
    const ll INF=1e18;
    #define pb push_back
    #define MP make_pair
    ll a[M],maxx[M],b[M];
    int main(){
        int t;
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin>>t;
        while(t--){
            int n;
            cin>>n;
            ll ans=0;
            for(int i=1;i<=n;i++){
                cin>>a[i];
                if(i&1)
                    ans+=a[i];
            }
            int tot=0;
            for(int i=1;i<=n;i+=2)
                if(i+1<=n)
                    b[++tot]=-a[i]+a[i+1];
            maxx[1]=b[1];
            ll tmp1=maxx[1];
            for(int i=2;i<=tot;i++){
                if(maxx[i-1]>0)
                    maxx[i]=maxx[i-1]+b[i];
                else
                    maxx[i]=b[i];
                tmp1=max(tmp1,maxx[i]);
            }
            ///
            tot=0;
            for(int i=1;i<=n;i+=2)
                if(i-1>=1)
                    b[++tot]=-a[i]+a[i-1];
            maxx[1]=b[1];
            ll tmp2=maxx[1];
            for(int i=2;i<=tot;i++){
                if(maxx[i-1]>0)
                    maxx[i]=maxx[i-1]+b[i];
                else
                    maxx[i]=b[i];
                tmp2=max(tmp2,maxx[i]);
            }
            cout<<max(ans,max(tmp1+ans,tmp2+ans))<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    ASP.NET应用程序与页面生命周期
    阻塞分析
    性能和异常日志
    solr 搜索引擎及搜索推荐应用
    solr 搜索引擎
    分布式缓存地址
    Windows平台分布式架构实践
    职责链模式vs状态模式区别
    HBase
    单例模式
  • 原文地址:https://www.cnblogs.com/starve/p/13284421.html
Copyright © 2011-2022 走看看