HDU 4719Oh My Holy FFF 线段树+DP
/*
** 日期: 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的更多相关文章
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- hdu4719 Oh My Holy FFF 线段树优化dp
思路 好久之前的了,忘记什么题目了 可以到我这里做luogu 反正就是hdu数据太水,导致自己造的数据都过不去,而hdu却A了 好像是维护了最大值和次大值,然后出错的几率就小了很多也许是自己写错了,忘 ...
- hdu4719 Oh My Holy FFF 线段树维护dp
题意:给你一个长度为n的数组v,你需要把这个数组分成很多段,你需要保证每一段的长度不能超过k我们设一共有m段,每一段右边界那个数为bi那么我们要使得sum(bi*bi-b(i-1))最大 (1< ...
- hdu 5773 The All-purpose Zero 线段树 dp
The All-purpose Zero 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5773 Description ?? gets an seq ...
- Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)
[题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...
- HDU.5692 Snacks ( DFS序 线段树维护最大值 )
HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
随机推荐
- powermockito单元测试之深入实践
概述 由于最近工作需要, 在项目中要做单元测试, 以达到指定的测试用例覆盖率指标.项目中我们引入的powermockito来编写测试用例, JaCoCo来监控单元测试覆盖率.关于框架的选择, 网上讨论 ...
- HelloDjango 系列教程:Django 的接客之道
文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 Web 服务简单的说就是处理请求,每个请求就像是一个"顾客".首先热情地把顾客迎接进来,然后满足用户的个性 ...
- Linux基础进程管理优先级
一.进程优先级 Linux进程调度及多任务 每个cpu(或者cpu核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程(和线程数)可以超出实际可用的cpu及核心数量.Li ...
- python基础之变量与数据类型
变量在python中变量可以理解为在计算机内存中命名的一个存储空间,可以存储任意类型的数据.变量命名变量名可以使用英文.数字和_命名,且不能用数字开头使用赋值运算符等号“=”用来给变量赋值.变量赋值等 ...
- 商贸型企业 Java 收货 + 入库 + 生成付款单
package cn.hybn.erp.modular.system.service.impl; import cn.hybn.erp.core.common.page.LayuiPageFactor ...
- DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129)
DedeCMS V5.7 SP2前台文件上传漏洞(CVE-2018-20129) 一.漏洞描述 织梦内容管理系统(Dedecms)是一款PHP开源网站管理系统.Dedecms V5.7 SP2版本中的 ...
- JavaWeb——使用会话维持状态2
在这次的例子里面,将完成一类似购物车的功能,在客户访问网站的时候,会选中自己将要购买的商品,而购物车将始终维持着商品的状态,会话将联系起选择第一个商品(第一个请求),选择其他商品(其他请求)以及付款等 ...
- Markdown 基本语法(后面继续补充)
1.1 Markdown 基础语法 有序内容和无序内容 有序内容:输入1.然后按tab键 无序内容:输入' * ' 或 ' - ' 然后后按tab键 字体的样式 *** 内容 *** 加粗加斜(中间没 ...
- 实现API优先设计的重要性和实现方式
应用API优先的方法意味着设计API时,使其具有一致性和适应性,无论应用于哪些开发项目.对API使用API描述语言(如OpenAPI)是关键,因为它有助于建立API与其他程序通信的枢纽,即使这些系 ...
- Multiple dex files define Lokhttp3/internal/wsWebSocketProtocol
Multiple dex files define Lokhttp3/internal/wsWebSocketProtocol 老套路,先晒图 图一:如题,在编译打包时遇到了如上错误,很明显这是一个依 ...