C. Four Segments 前缀后缀

Posted echozqn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Four Segments 前缀后缀相关的知识,希望对你有一定的参考价值。

C. Four Segments

这种分成了三个节点一般都可以处理一下前缀处理一下后缀,或者处理一下前面的这个点,处理一下后面的这个点,然后再枚举中间这个点。

如果和中间这个点有关的,那么就可以换一下顺序,先枚举中间这个点,然后处理前面和后面的点。

这个是先枚举中间这个点,然后往前面贪心,往后面贪心。

技术图片
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <map>
#include <list>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 5e3 + 10;
ll sum[maxn], a[maxn];

int main()

    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%lld", &a[i]), sum[i] = sum[i - 1] + a[i];
    ll ans = 0, x = 1, y = 1, z = 1;
    for(int i=1;i<=n;i++)
    
        ll res1 = 0, mark1 = 1;
        for (int j = i; j <= n + 1; j++) 
            ll num = sum[j - 1] * 2 - sum[i - 1] - sum[n];
            if (num > res1)    res1 = num, mark1 = j;
        
        ll res2 = 0, mark2 = 1;
        for (int j = 1; j <= i; j++) 
            ll num = 2 * sum[j - 1] - sum[i - 1];
            if (num > res2) res2 = num, mark2 = j;
        
        if(res1+res2>ans)
        
            ans = res1 + res2;
            x = mark2, y = i, z = mark1;
            // printf("ans=%d\n", ans);
        
    
    printf("%lld %lld %lld\n", x - 1, y - 1, z - 1);
    return 0;
View Code

 

以上是关于C. Four Segments 前缀后缀的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces901 C. Bipartite Segments

codeforces 762 C. Two strings

Boring Segments-CF教育场112.尺取+线段树

CF 1249D1 - Too Many Segments (easy version) 贪心+排序+set的使用

codeforces AIM Tec round 5(div1+div2) C. Rectangles

C. Pluses and Minuses 1300 / 思维 前缀和