因为正要学 动态最大连续区间和 所以先用分治做一下静态的。。。
以前是dp做的o(n)
分治大约是是nlogn
分治:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#include <iostream>
using namespace std;
const int maxn=100005;
struct node
{
int val,st,ed;
node(){}
node (int a,int b,int c)
{
val=a,st=b,ed=c;
}
};
int tm[maxn];
node get_mid(int l,int r)
{
int i;
int mid=(l+r)/2;
node ans;
ans.st=ans.ed=mid;
ans.val=tm[mid];
int sum=0;
int max1=0;
for (i=mid+1;i<=r;i++)
{
sum+=tm[i];
if (sum>max1)
{
max1=sum;
ans.ed=i;
}
}
if (max1>0)
ans.val+=max1;
sum=0;
int max2=0;
for (i=mid-1;i>=l;i--)
{
sum+=tm[i];
if (sum>=max2)
{
max2=sum;
ans.st=i;
}
}
if (max2>0)
ans.val+=max2;
return ans;
}
node slove(int l,int r)
{
if (l==r) return node(tm[l],l,r);
int mid=(l+r)/2;
node t1=slove(l,mid);
node t2=slove(mid+1,r);
node t3=get_mid(l,r);
node ans;
if (t1.val>=t2.val)
{
if (t1.val>=t3.val)
ans=t1;
else
ans=t3;
}
else
{
if (t3.val>=t2.val)
ans=t3;
else
ans=t2;
}
return ans;
}
int main()
{
int t,i;
int n,m;
cin>>t;
int cnt=1;
while (t--)
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&tm[i]);
}
node ans=slove(1,n);
if (cnt!=1) printf("\n");
printf("Case %d:\n",cnt++);
printf("%d %d %d\n",ans.val,ans.st,ans.ed);
}
return 0;
}
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
int main()
{
int t1[100005];
int t,j,n,k;
cin>>t;
for (j=1;j<=t;j++)
{
cin>>n;
int max;
cin>>t1[1];
int last=0;
int st=1;
int ed=1;
int tmp_head=1;
max=last=t1[1];
for (k=2;k<=n;k++)
{
cin>>t1[k];
if (last>=0) last+=t1[k];
else
{
last=t1[k];
tmp_head=k;
}
if (last>max)
{
st=tmp_head;
max=last;
ed=k;
}
}
printf("Case %d:\n",j);
cout<<max <<" ";
cout<<st<<" ";
cout<<ed<<endl;
if (j!=t)
cout<<endl;
}
return 0;
}