Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 1047 Accepted Submission(s): 291
o o o o o o o o o o o o o o o o o o
/F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\ /F\
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
o o o | o o o o | o o o o o o | o o o o o
/F\ /F\ /F\ | /F\ /F\ /F\ /F\ | /F\ /F\ /F\ /F\ /F\ /F\ | /F\ /F\ /F\ /F\ /F\
/ \ / \ / \ | / \ / \ / \ / \ | / \ / \ / \ / \ / \ / \ | / \ / \ / \ / \ / \
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define lc k<<1 #define rc k<<1|1 using namespace std; typedef long long ll; const int N=1e5+5; struct node{ll a,p;}d[N]; int n,T,L,cas;ll f[N];ll mx[N<<2]; void change(int k,int l,int r,int p,ll v){ if(l==r){mx[k]=v;return ;} int mid=l+r>>1; if(p<=mid) change(lc,l,mid,p,v); else change(rc,mid+1,r,p,v); mx[k]=max(mx[lc],mx[rc]); } ll query(int k,int l,int r,int x,int y){ if(l==x&&r==y) return mx[k]; int mid=l+r>>1; if(y<=mid) return query(lc,l,mid,x,y); else if(x>mid) return query(rc,mid+1,r,x,y); else return max(query(lc,l,mid,x,mid),query(rc,mid+1,r,mid+1,y)); } bool operator <(const node &x,const node &y){ return x.a!=y.a?x.a<y.a:x.p>y.p; } void work(){ ll nv,pre; scanf("%d%d",&n,&L); for(int i=1;i<=n;i++) scanf("%I64d",&nv),d[i].a=nv,d[i].p=i; sort(d+1,d+n+1); memset(f,-1,sizeof f); fill(mx,mx+(n<<2),-1); change(1,0,n,0,0); for(int i=1,ni;i<=n;i++){ ni=d[i].p; nv=d[i].a; pre=query(1,0,n,max(0,ni-L),ni-1); if(pre>=0){ f[ni]=pre+nv*nv; change(1,0,n,ni,f[ni]-nv); } if(ni==n) break; } if(f[n]>0) printf("%I64d\n",f[n]); else puts("No solution"); } int main(){ for(scanf("%d",&T);T--;){ printf("Case #%d: ",++cas);work(); /*for(int i=1;i<=n;i++) scanf("%d",a+i); for(int i=1;i<=n;i++){ for(int j=max(0,i-L);j<i;j++){ if(a[i]>a[j]){ f[i]=max(f[i],f[j]+a[i]*a[i]-a[j]); } } } if(!f[n]) puts("No solution"); else printf("%d\n",f[n]);*/ } return 0; }
hdu4719 Oh My Holy FFF[线段树优化dp]
原文:http://www.cnblogs.com/shenben/p/6709995.html