设$c[i]=g[i]+\frac{i(i+1)}{2}-a[i]\times i-a[i]$,$d[i]=a[i]-i$

$f[i]$表示以$i$为结尾最多保留多少个建筑,则

$f[i]=\max(f[j])+1$,$j<i且d[j]\leq d[i]$

$g[i]$表示以$i$为结尾的最小代价,则

$g[i]=\min(i\times d[j]+c[j])+b[i]+a[i]+\frac{i(i-1)}{2}$,$j<i,f[j]+1=f[i]且d[j]\leq d[i]$

按$f$一组一组来处理,每组按序号排序,然后分治处理。

分治的时候,按$d$排序,用栈维护凸壳,查询时在凸壳上二分。

时间复杂度$O(n\log^2n)$。

#include<cstdio>
#include<algorithm>
#define N 100010
using namespace std;
typedef long long ll;
int n,m,i,j,k,a[N],b[N],d[N],e[N],bit[N],f[N],ans0,G[N],nxt[N];
int cl,cr,L[N],R[N],top,q[N];
ll c[N],g[N],ans1=1LL<<62;
struct E{int x,t;E(){}E(int _x,int _t){x=_x,t=_t;}}h[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void umax(int&a,int b){if(a<b)a=b;}
inline void umin(ll&a,ll b){if(a>b)a=b;}
inline int lower(int x){
int l=1,r=n+1,mid,t;
while(l<=r)if(e[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline void ins(int x,int y){for(;x<=n+1;x+=x&-x)umax(bit[x],y);}
inline int ask(int x){int t=-N;for(;x;x-=x&-x)umax(t,bit[x]);return t;}
inline void add(int x,int y){nxt[y]=G[x];G[x]=y;}
inline bool cmp(int x,int y){return d[x]==d[y]?c[x]>c[y]:d[x]<d[y];}
inline double pos(int x,int y){return 1.0*(c[y]-c[x])/(d[x]-d[y]);}
inline void insert(int x){
if(top&&d[x]==d[q[top]])top--;
while(top>1&&pos(q[top],x)>pos(q[top],q[top-1]))top--;
q[++top]=x;
}
inline void query(int x){
if(!top)return;
int l=1,r=top-1,mid,t=top;
while(l<=r){
mid=(l+r)>>1;
if(x>pos(q[mid],q[mid+1]))r=(t=mid)-1;else l=mid+1;
}
umin(g[x],1LL*x*d[q[t]]+c[q[t]]);
}
void solve(int l,int r){
if(l==r)return;
int mid=(l+r)>>1,i,j;
solve(l,mid),solve(mid+1,r);
for(cl=0,i=l;i<=mid;i++)if(!h[i].t)L[++cl]=h[i].x;
for(cr=0,i=r;i>mid;i--)if(h[i].t)R[++cr]=h[i].x;
if(!cl||!cr)return;
sort(L+1,L+cl+1,cmp),sort(R+1,R+cr+1,cmp);
for(i=j=1,top=0;i<=cr;i++){
while(j<=cl&&d[L[j]]<=d[R[i]])insert(L[j++]);
query(R[i]);
}
}
int main(){
read(n);
for(i=1;i<=n;i++)read(a[i]);
for(i=1;i<=n;i++)read(b[i]),e[i+1]=d[i]=a[i]-i;
sort(e+1,e+n+2);
for(i=1;i<=n+1;i++)bit[i]=-N;
ins(lower(0),0);
for(i=1;i<=n;i++)g[i]=ans1,j=lower(d[i]),ins(j,f[i]=ask(j)+1);
ans0=ask(n+1);
for(i=0;i<=n;i++)G[i]=-1;
for(i=n;~i;i--)if(f[i]>=0)add(f[i],i);
for(i=0;i<ans0;i++){
j=G[i],k=G[i+1],m=0;
while(~j||~k){
if(j<0)h[++m]=E(k,1),k=nxt[k];
else if(k<0||j<k)h[++m]=E(j,0),j=nxt[j];
else h[++m]=E(k,1),k=nxt[k];
}
solve(1,m);
for(k=G[i+1];~k;k=nxt[k]){
g[k]+=b[k]+a[k]+1LL*k*(k-1)/2;
c[k]=g[k]+1LL*k*(k+1)/2-1LL*a[k]*k-a[k];
}
}
for(i=0;i<=n;i++)if(f[i]==ans0)umin(ans1,g[i]+1LL*(n-i)*a[i]+1LL*(n-i)*(n-i+1)/2);
return printf("%d %lld",ans0,ans1),0;
}

  

BZOJ2149 : 拆迁队的更多相关文章

  1. bzoj2149拆迁队 斜率优化dp+分治

    2149: 拆迁队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 397  Solved: 177[Submit][Status][Discuss] ...

  2. Bzoj2149拆迁队:cdq分治 凸包

    国际惯例的题面:我们考虑大力DP.首先重新定义代价为:1e13*选择数量-(总高度+总补偿).这样我们只需要一个long long就能维护.然后重新定义高度为heighti - i,这样我们能选择高度 ...

  3. 【BZOJ2149】拆迁队(斜率优化DP+CDQ分治)

    题目: 一个斜率优化+CDQ好题 BZOJ2149 分析: 先吐槽一下题意:保留房子反而要给赔偿金是什么鬼哦-- 第一问是一个经典问题.直接求原序列的最长上升子序列是错误的.比如\(\{1,2,2,3 ...

  4. ●BZOJ 2149 拆迁队

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题解: 斜率优化DP,栈维护凸包,LIS,分治(我也不晓得是不是CDQ分治...) 一 ...

  5. 核心业务系统数据库平台迁移: Oracle -> MySQL

    为了对核心技术拥有更多的自主控制能力,为了解决数据库的线性扩展问题,为了尽量减少对商业软件的依赖,为了摆脱对高端硬件的依赖,为了… 基于以上多种原因,2年前,我们计划将公司某核心应用平台进行大手术:数 ...

  6. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  7. RuPengWang项目

    项目 Day1------------------------- 说明:建外键约束.ashx+Razor RupengWang创建三个类库Model DAL BLL后台:RupengWang.Admi ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 玩家福音:10款最佳Linux免费游戏

    “我能在Linux平台上游戏吗?”这类疑问正困扰游戏玩家,那么答案就是“快去Linux平台吧!”.开源组织一直以来坚持不懈为Linux操作系统开发不同类型的游戏,在Linux平台下的游戏完全不亚于其他 ...

随机推荐

  1. AngularJS 简介、指令、表达式

    AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过指令扩展了 HTML,且通过表达式绑定数据到 HT ...

  2. Loadrunner上传与下载文件脚本

    一. 上传脚本 Action() { int uploadImgStatus = 0; //获取上传产品图ID web_reg_save_param_ex("ParamName=imgRan ...

  3. MVC – 5.MVC设计模式和.NetMVC框架

    MVC模式-设计模式 •控制器(Controller)- 负责转发请求,对请求进行处理. •视图 (View) - 界面设计人员进行图形界面设计. •模型 (Model)-业务逻辑.数据.验证规则.数 ...

  4. java 泛型 -- 泛型类,泛型接口,泛型方法

    泛型T泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束.在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数.形式类型参数与实际类型参数之间的关系类似于形式方 ...

  5. linux命令**50

    1.ls命令 命令格式: ls [选项] [目录名] 命令功能: 列出目标目录中所有的子目录和文件. 常用参数: -a,列出所有文件包括隐藏文件 -l,列出详细信息,文件大小一般以字节大小显示 -h, ...

  6. python多线程之Event(事件)

    #!/usr/bin/env python # -*- coding: utf-8 -*- import time from threading import Thread, Event import ...

  7. 基于PHP+Ajax实现表单验证的详解

    一,利用键盘响应,在不刷新本页面的情况下验证表单输入是否合法 用户通过onkeydown和onkeyup事件来触发响应事件.使用方法和onclick事件类似.onkeydown表示当键盘上的键被按下时 ...

  8. 单链表带头结点&不带头结点

    转自:http://blog.csdn.net/xlf13872135090/article/details/8857632 Node *head;  //声明头结点   带头结点初始化 void I ...

  9. input实时监控和获取焦点的问题,oninput,ononfocus

    1.input监控实时输入问题,google浏览器使用oninput,其他浏览器(IE6/7/8)使用onpropertychange var ie = !!window.ActiveXObject; ...

  10. Mysql怎样取消错误命令

    1.补上分号. 2.quit 3.由于Mysql中,‘号和"号都是成对出现的,故当错误键入'号或"号时,需要补全另一半才能退出.