/*
** 日期: 2013-9-12
** 题目大意:有n个数,划分为多个部分,假设M份,每份不能多于L个。每个数有一个h[i],
** 每份最右边的那个数要大于前一份最右边的那个数。设每份最右边的数为b[i],
** 求最大的sum{b[i]² - b[i - 1]},1≤i≤M,其中b[0] = 0。
** 思路:朴素DP为,dp[i]表示以i为结尾的最大划分。那么dp[i] = max{dp[j] - h[j] + h[i]²},
** 1≤i-j≤L,h[j]<h[i]。这种会超时,采取线段树优化。因为有两个限制,考虑到若h[j]≥h[i],
** 那么求i的时候一定不会用到j,那么先按h排序再DP(h相同的,i大的排前面)。
** __int64 没改完,导致wa了无数次
*/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson rt<<1,left,m
#define rson rt<<1|1,m+1,right
#define mid (left+right)>>1
using namespace std; typedef __int64 LL ;
const int maxn = 100005;
LL maxt[maxn<<2];
int L,n;
struct node{
int pos;LL h;
node(int id = 0,LL hight = 0):pos(id),h(hight){}
bool operator < (node a)const{
if( h == a.h)return pos > a.pos;
return h < a.h;
}
}arr[maxn];
void update(int rt,int left,int right,int place,LL val){
if( left == right){
maxt[rt] = val;
return ;
}
int m = mid;
if( place <= m)update(lson,place,val);
else update(rson,place,val);
maxt[rt] = max(maxt[rt<<1],maxt[rt<<1|1]);
}
LL query(int rt,int left,int right,int l,int r){
if( left >= l && right <= r){
return maxt[rt];
}
int m = mid;
LL res = -1;
if( l <= m)res = max(res,query(lson,l,r));
if( r > m )res = max(res,query(rson,l,r));
return res;
}
LL solve(){
sort(arr,arr+n);
LL res = -1;
memset(maxt,-1,sizeof(maxt));
update(1,0,n,0,0);
for(int i = 0; i < n; i++){
LL tmp = query(1,0,n,max(arr[i].pos-L,0),arr[i].pos - 1);
if( tmp == -1 ){
if( arr[i].pos == n)return -1;
continue;
}
res = tmp + (LL)arr[i].h*arr[i].h;
if( arr[i].pos == n)return res;
update(1,0,n,arr[i].pos,res - arr[i].h);
}
return res;
}
int main(){
int t,cas = 1;LL h;
scanf("%d",&t);
while( t-- ){
scanf("%d%d",&n,&L);
for(int i = 0; i < n; i++){
scanf("%I64d",&h);
arr[i] = node(i+1,h);
}
LL ans = solve();
printf("Case #%d: ",cas++);
if( ans == -1)puts("No solution");
else printf("%I64d\n",ans);
}
return 0;
}

HDU 4719Oh My Holy FFF 线段树+DP的更多相关文章

  1. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  2. hdu4719 Oh My Holy FFF 线段树优化dp

    思路 好久之前的了,忘记什么题目了 可以到我这里做luogu 反正就是hdu数据太水,导致自己造的数据都过不去,而hdu却A了 好像是维护了最大值和次大值,然后出错的几率就小了很多也许是自己写错了,忘 ...

  3. hdu4719 Oh My Holy FFF 线段树维护dp

    题意:给你一个长度为n的数组v,你需要把这个数组分成很多段,你需要保证每一段的长度不能超过k我们设一共有m段,每一段右边界那个数为bi那么我们要使得sum(bi*bi-b(i-1))最大 (1< ...

  4. hdu 5773 The All-purpose Zero 线段树 dp

    The All-purpose Zero 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5773 Description ?? gets an seq ...

  5. Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)

    [题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...

  6. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  7. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  8. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  9. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

随机推荐

  1. Zabbix 中使用 Percona Monitoring Plugins 监控 MySQL

    1.先安装agent客户端 tar zxvf zabbix-3.2.6.tar.gz cd zabbix-3.2.6 ./configure --prefix=/data/zabbix --enabl ...

  2. 泥瓦匠 5 年 Java 的成长感悟(下)

    继续<泥瓦匠 5 年 Java 的成长感悟(上)>,大致包括下面几点: 学技术的心态 学技术的学法 工作的心态 工作的硬技能 工作的软实力 听点雷子的民谣,我就安静地感概感概.上次说写的, ...

  3. 用mongodb 固定集合实现只保留固定数量的记录,自动淘汰老旧数据

    在一个保存report记录的场景中,我们使用MongoDB进行数据存储 example: db: report Collection: daily_report 创建db:  use report; ...

  4. 案例实战:每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化?

    出自:http://1t.click/7TJ 目录: 案例背景引入 特殊的电商大促场景 抗住大促的瞬时压力需要几台机器? 大促高峰期订单系统的内存使用模型估算 内存到底该如何分配? 新生代垃圾回收优化 ...

  5. Linux下Docker以及portainer相关配置

    一.安装使用Docer CE 本文以CentOS 7为例,安装docker CE版本,docker有两种版本,社区版本CE和企业版本EE,此处学习研究以CE版本为例, 两种安装方式可选:1.使用yum ...

  6. java 学习路线、java 入门、java自学、java 教程

    以前学习知识都是用到什么学什么,不是很系统.今天看到一个网站感觉挺不错的,分享给大家. 这个页面是学习路线功能的简介,如下图 ​ 点击选择学习路线 ​ 进入后可以选择循序渐进或者由终至始 ​ 上图标出 ...

  7. Elasticsearch索引增量统计及定时邮件实现

    0.需求 随着ELKStack在应用系统中的数据规模的急剧增长,每天千万级别数据量(存储大小:10000000*10k/1024/1024=95.37GB,假设单条数据10kB,实际远大于10KB)的 ...

  8. IDEA运行报错: Maven编译错误:不再支持源选项 5。请使用 6 或更高版本

    这里 记录下 这个问题的解决方案: 1:修改maven settings.xml 中的数据 这里的版本要对应现在使用的jdk版本 2:检查idea 配置 图中2块区域要一致 检查这块地方对应了自己的j ...

  9. 基于RBAC的权限框架

    RBAC权限框架(Role-Based Access Control)基于角色的权限访问控制的框架,通过用户-角色-权限的关联,非常方便的进行权限管理,在这里不再说明什么是RBAC,请自行百度. 谢谢 ...

  10. Arranging Your Team HDU - 3720 【DFS】

    思路 题意:此题大意是指首先给你23个队员的信息,包括他们的名字,能力值,在赛场上的职位.然后给出几个若能满足某两个队员同时在球场上就额外加上一定的值.最后让你从23个队员中选出11个人,使得最终的v ...