| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Why WA?[ index tree ]
#include<stdio.h>
#define MAX 100002
#define fmax(A,B) ((A)>(B)) ? (A) : (B)
int ifm[MAX];
int Dy1[MAX],Dy2[MAX];
int tree[3*MAX],temp=1;
int n,maxm,answer;
void input()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;i++) {
scanf("%d",&ifm[i]);
}
}
void setting()
{
int i,V;
for(;;) {
if(temp>=n) break;
temp*=2;
}
for(i=1;i<=3*n;i++) tree[i]=-99999999;
for(i=1;i<=n;i++) {
V=i+temp-1;
tree[V]=Dy2[i];
while(V>1) {
if(V%2==0) V=V/2;
else V=(V-1)/2;
tree[V]=fmax(tree[V],Dy2[i]);
}
}
}
void search_tree(int l,int r)
{
maxm=-99999999;
while(l<=r) {
if(l==r) {
maxm=fmax(maxm,tree[l]);
break;
}
if(l%2==1) {
maxm=fmax(maxm,tree[l]);
l=(l+1)/2;
}
else {
l/=2;
}
if(r%2==0) {
maxm=fmax(maxm,tree[r]);
r=(r-1)/2;
}
else {
r/=2;
}
}
}
void Dynamic()
{
answer=-99999999;
int i;
for(i=1;i<=n;i++) Dy1[i]=0; Dy2[i]=0;
for(i=1;i<=n;i++) {
if(ifm[i]<Dy1[i-1]+ifm[i]) Dy1[i]=Dy1[i-1]+ifm[i];
else Dy1[i]=ifm[i];
}
for(i=n;i>=1;i--) {
if(ifm[i]<Dy2[i+1]+ifm[i]) Dy2[i]=Dy2[i+1]+ifm[i];
else Dy2[i]=ifm[i];
}
setting();
for(i=1;i<=n;i++) {
search_tree(i+temp,n+temp-1);
if(answer<maxm+Dy1[i]) answer=maxm+Dy1[i];
}
}
void output()
{
printf("%d\n",answer);
}
int main()
{
for(;;) {
input();
if(n==0) break;
Dynamic();
output();
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator