Four Segments CodeForces - 846C

题目

题意:sum(l,r)表示数列a中索引为l到r-1(都包含)的数之和(如果l==r则为0)。给出数列a,求合适的delim0delim1delim2,使res = sum(0, delim0) - sum(delim0, delim1) + sum(delim1, delim2) - sum(delim2, n)最大。

方法:枚举delim1,扫一遍就可以求出此时能使res最大的delim0和delim2。记录res最大值。实现有一些细节,比如可以将res的计算公式化为前缀和的公式

曾经错在:1.int会爆,没注意  2.输出了调试的时候输出的内容(ans)而不是dl0,dl1,dl2

 1 #include<cstdio>
 2 typedef long long LL;
 3 LL n,a[6000],dl1,dl0,dl2,t_max_dl0,t_max_dl2,max_dl0,max_dl2,t_ans,ans,max1,max_dl1;
 4 int main()
 5 {
 6     LL i,t1;
 7     scanf("%lld",&n);
 8     for(i=0;i<n;i++)
 9         scanf("%lld",&a[i]);
10     for(dl1=0;dl1<n;dl1++)
11     {
12         t_ans=0;
13         t1=0;
14         for(i=0;i<dl1;i++)
15             t1-=a[i];
16         //此时表示dl0=0时sum(0,delim0)-sum(delim0,delim1)
17         max1=t1;
18         t_max_dl0=0;
19         for(dl0=1;dl0<=dl1;dl0++)
20         {
21             t1+=2*a[dl0-1];
22             if(t1>max1)
23             {
24                 max1=t1;
25                 t_max_dl0=dl0;
26             }
27         }
28         t_ans+=max1;
29         t1=0;
30         for(i=dl1;i<n;i++)
31             t1-=a[i];
32         //此时表示dl2=dl1时sum(delim1,delim2)-sum(delim2,n)
33         max1=t1;
34         t_max_dl2=dl1;
35         for(dl2=dl1+1;dl2<=n;dl2++)
36         {
37             t1+=2*a[dl2-1];
38             if(t1>max1)
39             {
40                 max1=t1;
41                 t_max_dl2=dl2;
42             }
43         }
44         t_ans+=max1;
45         if(t_ans>ans)
46         {
47             max_dl0=t_max_dl0;
48             max_dl1=dl1;
49             max_dl2=t_max_dl2;
50             ans=t_ans;
51         }
52     }
53     printf("%lld %lld %lld",max_dl0,max_dl1,max_dl2);
54     //printf("%lld",ans);
55     return 0;
56 }
View Code

暴力对拍程序:

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 typedef long long LL;
 5 LL c[5010];
 6 LL n,m;
 7 LL res,max_res,a1,a2,a3;
 8 LL lowbit(LL x)
 9 {
10     return x&-x;
11 }
12 void add(LL num,LL x)
13 {
14     while(num<=n)
15     {
16         c[num]+=x;
17         num+=lowbit(num);
18     }
19 }
20 LL sum1(LL x)
21 {
22     LL ans=0;
23     while(x>0)
24     {
25         ans+=c[x];
26         x-=lowbit(x);
27     }
28     return ans;
29 }
30 LL sum(LL l,LL r)
31 {
32     if(l>r)    return 0;
33     return sum1(r)-sum1(l-1);
34 }
35 int main()
36 {
37     LL i,j,k,t;
38     scanf("%lld",&n);
39     for(i=1;i<=n;i++)
40     {
41         scanf("%lld",&t);
42         add(i,t);
43     }
44     for(i=0;i<=n;i++)
45         for(j=i;j<=n;j++)
46             for(k=j;k<=n;k++)
47             {
48                 res=sum(1,i)-sum(i+1,j)+sum(j+1,k)-sum(k+1,n);
49                 if(res>max_res)
50                 {
51                     max_res=res;
52                     a1=i;a2=j;a3=k;
53                 }
54             }
55     printf("%lld",max_res);
56     return 0;
57 }
View Code

 

posted @ 2017-09-07 19:41  hehe_54321  阅读(349)  评论(0编辑  收藏  举报
AmazingCounters.com