• 【CF Edu 28 C. Four Segments】


    time limit per test 1 second

    memory limit per test 256 megabytes

    input standard input

    output standard output

    You are given an array of n integer numbers. Let sum(l, r) be the sum of all numbers on positions from l to r non-inclusive (l-th element is counted, r-th element is not counted). For indices l and r holds 0 ≤ l ≤ r ≤ n. Indices in array are numbered from 0.

    For example, if a = [ - 5, 3, 9, 4], then sum(0, 1) =  - 5, sum(0, 2) =  - 2, sum(1, 4) = 16 and sum(i, i) = 0 for each i from 0 to 4.

    Choose the indices of three delimiters delim0, delim1, delim2 (0 ≤ delim0 ≤ delim1 ≤ delim2 ≤ n) and divide the array in such a way that the value of res = sum(0, delim0) - sum(delim0, delim1) + sum(delim1, delim2) - sum(delim2, n) is maximal.

    Note that some of the expressions sum(l, r) can correspond to empty segments (if l = r for some segment).

    Input

    The first line contains one integer number n (1 ≤ n ≤ 5000).

    The second line contains n numbers a0, a1, ..., an - 1 ( - 109 ≤ ai ≤ 109).

    Output

    Choose three indices so that the value of res is maximal. If there are multiple answers, print any of them.

    Examples

    input

    3
    -1 2 3

    output

    0 1 3

    input

    4
    0 0 -1 0

    output

    0 0 0

    input

    1
    10000

    output

    1 1 1
     
    【翻译】给出一个长度为n的序列(1~n),现在需要选择三个点d1,d2,d2(0<=d1<=d2<=d3<=n),设ABCD分别为区间(0,d1],(d1,d2],(d2,d3],(d3,n]的内部元素和,求A-B+C-D取到最大值时d1,d2,d3的值,情况多种就随便输出一种。
     
    题解:
    ①好像怎么弄都是O(n2),枚举d2,然后取d1,d3的最有位置更新答案。
        ②为辅助上述方法,预处理(A-B),(C-D)的最大值,并记录取最大值时候d的位置。
        ③预处理会使用到前缀和。
    #include<stdio.h>
    #define ll long long
    #define comb (val1[i]+val2[i])
    #define S(l,r) (sum[r]-sum[l-1])
    #define go(i,a,b) for(int i=a;i<=b;i++)
    const int N=5003;int n,p1[N],p3[N],P1,P2,P3;
    ll a[N],_[N],sum[N],val1[N],val2[N],ans,t;
    int main()
    {	
    	scanf("%d",&n);ans=1ll*-1e9*1e9;
    	
    	go(i,1,n)scanf("%I64d",a+i),sum[i]=sum[i-1]+a[i];
    	go(i,0,n){val1[i]=1ll*-1e9*1e9;
    	go(j,0,i)if((t=S(1,j)-S(j+1,i))>val1[i])p1[i]=j,val1[i]=t;}
    	go(i,0,n){val2[i]=1ll*-1e9*1e9;
    	go(j,i,n)if((t=S(i+1,j)-S(j+1,n))>val2[i])p3[i]=j,val2[i]=t;}
    	go(i,0,n)if(val1[i]+val2[i]>ans)ans=comb,P1=p1[i],P2=i,P3=p3[i];
    		
    	printf("%d %d %d
    ",P1,P2,P3);return 0;
    }//Paul_Guderian
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    挥挥手倦鸟飞过丛林,隐没在碎与溃的深谷。——————汪峰《挥挥手》

  • 相关阅读:
    网站安全编程 黑客入侵 脚本黑客 高级语法入侵 C/C++ C# PHP JSP 编程
    【算法导论】贪心算法,递归算法,动态规划算法总结
    cocoa2dx tiled map添加tile翻转功能
    8月30日上海ORACLE大会演讲PPT下载
    【算法导论】双调欧几里得旅行商问题
    Codeforces Round #501 (Div. 3) B. Obtaining the String (思维,字符串)
    Codeforces Round #498 (Div. 3) D. Two Strings Swaps (思维)
    Educational Codeforces Round 89 (Rated for Div. 2) B. Shuffle (数学,区间)
    洛谷 P1379 八数码难题 (BFS)
    Educational Codeforces Round 89 (Rated for Div. 2) A. Shovels and Swords (贪心)
  • 原文地址:https://www.cnblogs.com/Damitu/p/7659549.html
Copyright © 2020-2023  润新知