似乎又是一道cdq维护dp

这题首先要按照d[i]=a[i]-i的值分层dp。

在cdq分治中,相当于前一层dp为修改,当前层为询问。

考虑如何维护[l,mid]的修改对于[mid+1,r]的询问的影响。

列出dp方程发现只要寻找最小值即可。

然后就在维护的凸包上三分最小值的位置就好。

#include <bits/stdc++.h>
#define gc getchar()
#define N 120009
#define mid (l+r>>1)
#define ll long long
using namespace std;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll n,m,a[N],b[N],d[N],f[N],sta[N],top,g[N];
vector<ll> p[N];
struct node
{ll x,y,pos,k;node(ll pos=0,ll k=0):pos(pos),k(k){x=d[pos],y=g[pos]-a[pos]*pos-a[pos]+(pos+1)*pos/2;}bool operator <(const node &rhs) const{return pos<rhs.pos;}
}q[N],now[N],st[N];
bool cmp(const node &lhs,const node &rhs)
{return d[lhs.pos]<d[rhs.pos]||(d[lhs.pos]==d[rhs.pos]&&!lhs.k);
}
ll read()
{ll x=1;char ch;while (ch=gc,ch<'0'||ch>'9') if (ch=='-') x=-1;ll s=ch-'0';while (ch=gc,ch<='9'&&ch>='0') s=s*10+ch-'0';return s*x;
}
void solve(ll l,ll r)
{if (l==r){if (q[l].k)g[q[l].pos]+=a[q[l].pos]+b[q[l].pos]+(q[l].pos-1)*q[l].pos/2;return;}solve(l,mid);ll num=0;for (ll i=l;i<=mid;i++) if (!q[i].k) now[++num]=q[i];//modify in [l,mid]for (ll i=mid+1;i<=r;i++) if (q[i].k) now[++num]=q[i];//qry in [mid+1,r]sort(now+1,now+num+1,cmp);//sort for dtop=0;for (ll i=1;i<=num;i++)//d is increasing{
#define j now[i]if (!j.k)//slope optimization{while (top>=2&&1.0*(j.y-st[top].y)*(st[top].x-st[top-1].x)<1.0*(st[top].y-st[top-1].y)*(j.x-st[top].x))top--;st[++top]=j;}else{ll L=1,R=top,len,mid_l,mid_r;//divide into three parts for the bestwhile (R-L>4){len=(R-L)/3,mid_l=L+len,mid_r=R-len;if (st[mid_l].x*j.pos+st[mid_l].y>st[mid_r].x*j.pos+st[mid_r].y) L=mid_l;else R=mid_r;//min}while (L<=R) g[j.pos]=min(g[j.pos],st[L].x*j.pos+st[L].y),++L;}
#undef j}solve(mid+1,r);
}
int main()
{n=read();for (ll i=1;i<=n;i++) a[i]=read(),d[i]=a[i]-i,sta[i]=g[i]=inf;for (ll i=1;i<=n;i++) b[i]=read();for (ll i=1;i<=n;i++){if (d[i]<0) continue;f[i]=upper_bound(sta+1,sta+n+1,d[i])-sta;p[f[i]].push_back(i);sta[f[i]]=min(sta[f[i]],d[i]);}p[0].push_back(0);for (ll i=1;;i++){if (p[i].empty()){ll ret=inf;for (ll j=0,k;j<(ll)p[i-1].size();j++){k=p[i-1][j];ret=min(ret,g[k]+(a[k]*2+n-k+1)*(n-k)/2);}printf("%lld %lld\n",i-1,ret);break;}m=0;for (ll j=0;j<(ll)p[i-1].size();j++) q[++m]=node(p[i-1][j],0);for (ll j=0;j<(ll)p[i].size();j++) q[++m]=node(p[i][j],1);sort(q+1,q+m+1);solve(1,m);}return 0;
}

【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 : 拆迁队

    设$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( ...

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

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

  5. bzoj2149 拆迁队 CDQ分治

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. HP c3000/c7000 blade switch GBE2c 初始配置
  2. mysql截取字符串函数left和right和substring和substring_index
  3. Android开发中怎样调用系统Email发送邮件(多种调用方式)
  4. BZOJ3453 XLkxc(拉格朗日插值)
  5. H.264 中很有用的一些概念
  6. 六、Web服务器——FilterListener 学习笔记
  7. mysql 上级组织参数值_MYSQL组织结构设计构思(快速查上级和下级)
  8. 地市级地铁数据管理信息系统解决方案
  9. [TJOI2007]路标设置
  10. linux版的微博客户端,推荐Ubuntu Linux下的新浪微博客户端
  11. xlua生成Wrap代码排除指定dll
  12. Debian Linux及kali程序安装卸载方式
  13. Vue——May(1)
  14. libopencv_viz.so未定义使用
  15. 利器 | Java 接口自动化测试首选方案:REST Assured 实践 (一)
  16. 免费域名和付费域名的几个区别
  17. Impala Shell 和 Impala SQL
  18. 如果是有意隐藏,请使用关键字 new。
  19. FlexRay™ 协议控制器 (E-Ray)-04
  20. python解压压缩包的几种方法

热门文章

  1. kubernete编排技术三:StatefulSet
  2. 王者荣耀是如何毁掉我的!!!
  3. html 在ie下显示黑屏,win10 ie会黑屏怎么处理?win10 ie打开黑屏解决教程
  4. html3d扇形菜单,扇形菜单特效
  5. java set 有序的吗_java set 顺序
  6. 有图有故事 - Watson Analytics 解析幸福指数
  7. 智能驾驶下半场!华锐捷/畅行智驾/木牛科技/奥迪威的答案是?
  8. 有多少人知道睿捷的前身?
  9. linux命令如何删除用户,linux删除用户的命令是什么?
  10. mysql numa_mysql 内存优化之关闭numa