设$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;
}

  

转载于:https://www.cnblogs.com/clrs97/p/5189503.html

BZOJ2149 : 拆迁队相关推荐

  1. 【分治+斜率优化】BZOJ2149拆迁队 CF660F Bear and Bowling 4

    BZOJ2149拆迁队 [题目] 原题地址 题目大意不想写. [题目分析] 斜率优化的dp是显然的,然后就是怎么维护的问题了. [解题思路] 这题显然就是一个斜率优化的dp,然后分治的时候维护一下凸壳 ...

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

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

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

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

  4. bzoj2149 拆迁队 CDQ分治

    首先对于任意a[i]都减去一个i转化为单调不下降序列方便操作,设新的d[i]=a[i]-i.然后第一问二分或者BIT水过去,设f[i]表示i为结尾的最长序列. 然后设g[i]为保留i时的最优值,那么可 ...

  5. 【2011集训队出题】拆迁队

    Description: lanxisi带领着他的拆迁队来整治一个街道.这个街道由N个旧房子组成,从左到右编号为1..N.每个旧房子i有一个正整数的美观度Ai. lanxisi希望整个街道从左到右美观 ...

  6. [国家集训队2011]拆迁队nbsp;解题报告

    题目: http://cogs.pro/cogs/problem/problem.php?pid=1859 lanxisi带领着他的拆迁队来整治一个街道.这个街道由N个旧房子组成,从左到右编号为1.. ...

  7. chrome游戏:“钉子户大战拆迁队(Guard NailHoushold)”和“The Fancynbs

    查看原文:http://www.hellonet8.com/214.html 上个月chrome OS发布的时候,chrome 8 用户可以通过web store下载程序,自己就好奇进去下了些东西耍会 ...

  8. chrome游戏:“钉子户大战拆迁队(Guard NailHoushold)”和“The Fancy Pants Adventure: World 2”...

    上个月chrome OS发布的时候,chrome 8 用户可以通过web store下载程序,自己就好奇进去下了些东西耍会.好多程序就是简简单单的一个网页,可用性不怎么样,所以基本都被我卸载了.现在还 ...

  9. 《C#妹妹和Objective-C阿姨对话录》(04)垃圾回收基础--拆迁队那点事

    C#妹妹:操作系统天天说控制内存空间价格,咋还这么高?我巨资购买的内存空间,后来发现竟然在硬盘上!虚拟内存!TMD! Objective-C阿姨:操作系统全靠卖内存空间挣钱呢,你说价格能会降么?你看看 ...

最新文章

  1. DTCC 2020 | 阿里云程实:云原生时代的数据库管理
  2. iOS应用开发的五个Java开源工具
  3. Spring入门(二)之下载与安装
  4. 怎么批量在数字里加入网页_手把手教你爬取天堂网1920*1080大图片(批量下载)——理论篇
  5. 雷军自述:我十年的程序员生涯
  6. oracle 连接字符串备份
  7. C++ 计算三角形面积
  8. python 对接萤石云,录制可播放的MP4视频
  9. Python简单模拟微信发红包
  10. 代理服务器与NAT技术
  11. 工作中,掌握这四个说话技巧,再也不用担心自己不会说话
  12. php utc时间_php如何设置utc时区
  13. 网易云音乐APP(基于APICloud平台)
  14. 2021国防科技大学计算机学院无军籍考研409分经验贴(数一+英一+834)
  15. 业务突破!看 Docker 如何帮助 BCG Gamma 打造安全的软件供应链
  16. 污染源动态管控系统 污染源动态管理系统
  17. 基于zynq的千兆网udp项目_基于Zynq平台的EtherCAT主站方案实现
  18. Nero刻录ISO文件的过程步骤详解
  19. vc2008/vc2015 和 Mac 编译 zlib-1.2.8
  20. QQ网页微信、QQ二维码登录原理分析(整理)

热门文章

  1. [企业管理]一个软件企业管理的典型案例分析
  2. Windows更改显示dir命令为ls命令
  3. rancher安装elasticsearch6.4.0的head插件
  4. 什么是缓存? 如何测试缓存? 以Redis为例
  5. mac设置mysql root密码_mac如何更改mysql root密码 Mac平台重新设置MySQL的root密码
  6. 电脑打开回收站显示服务器运行失败,win7 64位系统无法清空回收站的故障原因及解决方法...
  7. Python 格式化日期
  8. 自建商业网站,并通过cpolar内网穿透发布到公网可访问(6)
  9. Win2000终端存在的问题及解决
  10. 扎克伯格谈Facebook创业过程