zoukankan      html  css  js  c++  java
  • 【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
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

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

  • 相关阅读:
    JavaScript 弹出层,背景变暗
    DataGridView常见用法和FAQ汇总
    将visual studio 2005 SP1补丁整合到安装文件
    非常经典的网络蜘蛛示例
    asp.net画曲线图(折线图)
    Asp.net中基类页的设计和使用
    使用 Visual C# .NET 向 Excel 工作簿传输数据
    CSS布局:让页脚始终保持底部的方法
    WinForm开发,窗体显示和窗体传值相关知识总结
    asp.net Urlrewriter在虚拟主机上的使用方法
  • 原文地址:https://www.cnblogs.com/Damitu/p/7659549.html
Copyright © 2011-2022 走看看