/*
** 日期: 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. 【iOS】Your account already has a valid ios

    打包内测的时候遇到了这个问题,如图所示: 官网解决办法: If the certificate already exists in Member Center, a “Your account alr ...

  2. Spring中FactoryBean的作用和实现原理

    BeanFactory与FactoryBean,相信很多刚翻看Spring源码的同学跟我一样很好奇这俩货怎么长得这么像,分别都是干啥用的.BeanFactory是Spring中Bean工厂的顶层接口, ...

  3. 检测人脸及眼睛【OpenCV-Python实现 源码+打包.exe文件】

    之前用opencv做的一个人脸及双眼检测,在此分享给大家 链接:https://pan.baidu.com/s/1BsKBH3wOF9TmdbRlPagEVQ 提取码:cqkv 效果如下:

  4. 使用Java 编写FTP中的长传文件和下载文件

    实现FTP文件上传与下载可以通过以下两种种方式实现(不知道还有没有其他方式,),分别为:1.通过JDK自带的API实现:2.通过Apache提供的API是实现. 第一种方法:通过JDK自带的API实现 ...

  5. 【原创】NES第一波:如何用通用型6502宏汇编器,制用NES/FC游戏。

    在163的博客关了呀.在这边重新开张了. 以后若网友有什么要长篇解答的问题,也在这儿作答. 作为第一波原创文章,我打算做一次小白示范.那就是一步一步的展示某个汇编编译器的用法. 一.科普 很多人认为程 ...

  6. Windows 下配置 Vagrant 环境

    Vagrant是一个基于 Ruby 的工具,用于创建和部署虚拟化开发环境.它使用 Oracle 的开源VirtualBox虚拟化系统. Vagrant 在快速搭建开发环境方面是很赞的,试想一个团队中, ...

  7. [Spring cloud 一步步实现广告系统] 16. 增量索引实现以及投送数据到MQ(kafka)

    实现增量数据索引 上一节中,我们为实现增量索引的加载做了充足的准备,使用到mysql-binlog-connector-java 开源组件来实现MySQL 的binlog监听,关于binlog的相关知 ...

  8. if IE语句 | 判断浏览器IE版本及添加升级提示

    本文引自:http://blog.csdn.net/u013372487/article/details/48521929 实现方法 判断当前浏览器是否IE6(或IE6内核) <!--[if I ...

  9. NAS

    NAS, Network Attached Storage, 网络附属存储, 简单来说就是连接在网络上, 可以存储资料的装置.可以用来做私有网盘,同步各种设备的照片.视频.音频和文件. 常见的 NAS ...

  10. Spring1

    一.Spring是什么?有什么用? Spring的适用环境是这样的,假设现在有一个类port,它将提供一个返回消息的功能,代码如下: public class port { private weibo ...