/*
** 日期: 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. C# sql 批量插入数据库的语句

    //执行DataTable数据导入 public static int UpdateDt(string strConn, DataTable dt) { try { string tablaName ...

  2. Scrapy框架安装失败解决办法

    安装报错信息 正常安装: pip3 install scrapy 出现报错信息如下: 两种解决办法 第一种方法 最根本得解决办法 需要我们安装  Microsoft Visual C++ 14.0  ...

  3. UE4中UMG与C++交互 页面文本修改

    在UE4中,有两种方式创建ui,一种是使用slate的方式,一种是UMG,UMG是slate的封装,是一个可视化的ui编辑器.slate则是纯c++方式(之前实验过一次slate创建页面,代码相当麻烦 ...

  4. mule优缺点和MEL

    优点1.开源 https://github.com/mulesoft/mule2.丰富的connector ,可以通过不同的形式来连接各个系统JMS.Web Service.JDBC.HTTP等3.c ...

  5. c# 控制台console进度条

    1 说明 笔者大多数的开发在 Linux 下,多处用到进度条的场景,但又无需用到图形化界面,所以就想着弄个 console 下的进度条显示. 2 步骤 清行显示 //清行处理操作 int curren ...

  6. spark shuffle写操作三部曲之BypassMergeSortShuffleWriter

    前言 再上一篇文章 spark shuffle的写操作之准备工作 中,主要介绍了 spark shuffle的准备工作,本篇文章主要介绍spark shuffle使用BypassMergeSortSh ...

  7. Java的几种常见排序算法

    一.所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面. ...

  8. Vue监听键盘回车事件

    在写页面时遇见了登录页需要加一个键盘回车事件. vue 的 v-on中有这样的修饰符 <input v-on:keyup.enter="submit"> 即<in ...

  9. 转载:MyBatis mapper.xml中使用静态常量或者静态方法

    转自:https://my.oschina.net/wtslh/blog/682704 今天偶然之间刷到了这样一篇博客,有点意外 mybatis 还可以这样使用ONGL常量的方式,该方式针对 xml的 ...

  10. LeetCode 85. 冗余连接 II

    题目: 在本问题中,有根树指满足以下条件的有向图.该树只有一个根节点,所有其他节点都是该根节点的后继.每一个节点只有一个父节点,除了根节点没有父节点. 输入一个有向图,该图由一个有着N个节点 (节点值 ...