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(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;
}

  

时间: 2024-08-29 02:05:48

BZOJ2149 : 拆迁队的相关文章

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

2149: 拆迁队 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 397  Solved: 177[Submit][Status][Discuss] Description lanxisi带领着他的拆迁队来整治一个街道.这个街道由N个旧房子组成,从左到右编号为1..N.每个旧房子i有一个正整数的美观度Ai. lanxisi希望整个街道从左到右美观度严格递增,也就是保证Ai<Aj(i<j).但是旧的街道明显不符合这个要求,于是lanxisi希望拆

老上海谈上海棚户、旧里拆迁史

老上海谈上海棚户.旧里拆迁史 [摘要] 殖民者“越界筑路”留下的愚园路.武夷路.新华路,都拥有着不逊于法租界西区的优雅居住环境.万航渡路两侧的兆丰公园和圣约翰大学,是长宁独有的风景线.80年代末开始发展起来的虹桥开发区和古北新区,使长宁变成了有钱人的天堂. 标题里厚着脸皮自称老上海,其实我只是一个80后.但关注上海城市建设十余年,骑车走遍上海外环以内的每一条马路,再加上阅书百余本,想来对这座城市的变化应该是有发言权的.今天,就来谈谈这十几年来上海各个区的棚户.旧里拆迁情况. 长宁区: 殖民者“越

写给过去25年和未来10年的自己!

"死亡是哲学的开端!"忘了是在哪本书上看到这句话,当时给我的震撼很大,没想到时隔这么久,回想起来依旧让我很震撼,而且更加深刻. 我大概是在高二到高三的那个时间段,就一直在思考死亡,因为当时周边的环境让我很压抑,让我想到的是死亡.虽然很压抑,但同时也是我迈向人格独立的第一步,回想起来,并不觉得触目惊心,反而觉得有点平淡,也让我窃喜,因为如果没有那段岁月,可能我现在依旧还是一个傻到没心没肺的boy.可是也没有夸张到说我一夜成仙,立地成佛的地步.岁月依旧,我还是和大部分人相同,吃饭.睡觉.学

中国股灾,一场全民性的风险教育

在刚刚过去的三周内,中国股市连续出现暴跌.据相关数据统计,自6月15日至7月2日,沪深两市市值蒸发了16.43万亿,平均每天蒸发1.17万亿,最后一个交易日,A股跌破整数关口4000点,最终停留在绿油油的3686点,距离年内最高的5178点已经有相当一段距离了.大盘整体跌幅超过28%,按照国际标准,这已经不是一场普通意义上的调整,而是一场真正的股灾.然而,比大盘更绿的是另外570家上市公司,股价相比最高点跌幅几乎腰斩,而汉邦高科.金石东方.双节电气等,年内最大跌幅竟然超过了70%,算得上本次股灾

60条知乎神回复,大部分都比较有道理

转载:http://news.timedg.com/2015-07/27/20184368.shtml1.问:你收到的最雷的表白语是什么?知友:程冬冬做我女朋友行不行,行就行,不行我再想想办法. 2.问:“晚来天欲雪,能饮一杯无”,怎么回复比较霸气?知友:鼓鼓司机一行酒,亲人两行泪. 3.问:为什么中国人这么喜欢拍古装片?知友:magasa科幻片面临的最大问题是,在未来时空还要不要党的领导? 4.问:女朋友和女性朋友有什么区别?知友:James Swineson中国人取名字有一个习惯:实际上缺什

RuPengWang项目

项目 Day1------------------------- 说明:建外键约束.ashx+Razor RupengWang创建三个类库Model DAL BLL后台:RupengWang.Admin 前台:RupengWang.Front 建一个后台管理员的表T_AdminUsers(Id UserName Password)打开动软,生成三层代码 (报错,是因为UAC是不用随意的写入数据,方法是以管理员运行,没有就去属性兼容性中找),(工具-选项-配置-命令规则),(新建net项目-工厂模

搞笑段子

记者采访农民工:假如中日爆发战争,你愿意上前线吗? 农民工:上前线有户籍限制吗?要暂住证吗?要上岗证.健康证么?需要有一年以上完税证明么?我什么都没有,不是党员,就是一个农民,能上吗?还有,牺牲了大家赔钱都一个价吗?真打的时候,分单双号吗?冲锋前要摇号吗?多久能摇上号?可以站在城管和拆迁队的后面么

知乎-神回复

文章转帖于http://www.yixieshi.com/youqu/22135.html 整理了知乎100条机智回答, 在这些神回复里,你能深深感受到汉语文化的勃大,不对,博大精深… 1. 问:你收到的最雷的表白语是什么? 知友:程冬冬 做我女朋友行不行,行就行,不行我再想想办法. 2. 问:“晚来天欲雪,能饮一杯无”,怎么回复比较霸气? 知友:鼓鼓 司机一行酒,亲人两行泪. 3. 问:「滚床单」有哪些优雅的叫法? 知友:匿名用户 管鲍之交. 4. 问:为什么中国人这么喜欢拍古装片? 知友:m

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

“我能在Linux平台上游戏吗?”这类疑问正困扰游戏玩家,那么答案就是“快去Linux平台吧!”.开源组织一直以来坚持不懈为Linux操作系统开发不同类型的游戏,在Linux平台下的游戏完全不亚于其他几个平台. 假如当你考虑从 Windows 平台迁移至 Linux 平台时,“我能在 Linux 平台上游戏吗?”这类疑问正困扰着你,那么对此这有一个答案就是 ———— “快去 Linux 平台吧!”.感谢开源组织一直以来坚持不懈为 Linux 操作系统开发不同类型的游戏,还有从不缺乏好的商业游戏,