2149: 拆迁队

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 397  Solved: 177
[Submit][Status][Discuss]

Description

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

lanxisi希望整个街道从左到右美观度严格递增,也就是保证Ai<Aji<j)。但是旧的街道明显不符合这个要求,于是lanxisi希望拆迁一些旧房子并在原地建立新房子来满足这一要求。但是与很多拆迁队一样,很多钉子户拒绝拆迁。所以lanxisi希望能保留最多的旧房子来满足某些钉子户,当然,保留一个旧房子需要给房子主人Bi的赔偿金。最后,总花费=整治好以后所有房子美观度之和+赔偿金之和。新的美观值也都必须是正整数。

现在,请你求出lanxisi最多能保留多少旧房子和整治这个街道所需要的最少总花费(当然是在保留旧房子最多这个前提下的)。

Input

第一行有1个整数N,表示旧房子个数。第二行有N个整数,第i个数Ai表示旧房子的美观度。第三行有N个整数,第i个数Bi表示保留旧房子的赔偿金。

Output

第一行输出2个整数,表示保留的旧房子数量、总花费的大小。【样例输入一】 4 2 1 7 4 1 5 4 3 【样例输入二】 6 1 6 3 4 7 7 1 2 1 1 1 9

Sample Input

【样例输出一】
2 25

【样例输出二】
4 29

【数据范围】
100%的数据中,1<=N<=100000,0<=Ai,Bi<=100000000。

Sample Output

HINT

Source

这道题2个问 第一问是减去下标求lis 第二问在第一问基础上维护转移

还是有点麻烦 不多哔哔了

这篇博客写得不错http://www.cnblogs.com/zj75211/p/8125193.html

贴个代码

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 100005
 4 using namespace std;
 5 typedef long long ll;
 6 int n,m,i,j,k,a[N],b[N],d[N],e[N],bit[N],f[N],ans0,G[N],nxt[N];
 7 int cl,cr,L[N],R[N],top,q[N];
 8 ll c[N],g[N],ans1=1LL<<62;
 9 struct E{int x,t;E(){}E(int _x,int _t){x=_x,t=_t;}}h[N];
10 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';}
11 void umax(int&a,int b){if(a<b)a=b;}
12 void umin(ll&a,ll b){if(a>b)a=b;}
13 int lower(int x){
14   int l=1,r=n+1,mid,t;
15   while(l<=r)if(e[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
16   return t;
17 }
18 void ins(int x,int y){for(;x<=n+1;x+=x&-x)umax(bit[x],y);}
19 int ask(int x){int t=-N;for(;x;x-=x&-x)umax(t,bit[x]);return t;}
20 void add(int x,int y){nxt[y]=G[x];G[x]=y;}
21 bool cmp(int x,int y){return d[x]==d[y]?c[x]>c[y]:d[x]<d[y];}
22 double pos(int x,int y){return 1.0*(c[y]-c[x])/(d[x]-d[y]);}
23 void insert(int x){
24   if(top&&d[x]==d[q[top]])top--;
25   while(top>1&&pos(q[top],x)>pos(q[top],q[top-1]))top--;
26   q[++top]=x;
27 }
28 void query(int x){
29   if(!top)return;
30   int l=1,r=top-1,mid,t=top;
31   while(l<=r){
32     mid=(l+r)>>1;
33     if(x>pos(q[mid],q[mid+1]))r=(t=mid)-1;else l=mid+1;
34   }
35   umin(g[x],1LL*x*d[q[t]]+c[q[t]]);
36 }
37 void solve(int l,int r){
38   if(l==r)return;
39   int mid=(l+r)>>1,i,j;
40   solve(l,mid),solve(mid+1,r);
41   for(cl=0,i=l;i<=mid;i++)if(!h[i].t)L[++cl]=h[i].x;
42   for(cr=0,i=r;i>mid;i--)if(h[i].t)R[++cr]=h[i].x;
43   if(!cl||!cr)return;
44   sort(L+1,L+cl+1,cmp),sort(R+1,R+cr+1,cmp);
45   for(i=j=1,top=0;i<=cr;i++){
46     while(j<=cl&&d[L[j]]<=d[R[i]])insert(L[j++]);
47     query(R[i]);
48   }
49 }
50 int main(){
51   read(n);
52   for(i=1;i<=n;i++)read(a[i]);
53   for(i=1;i<=n;i++)read(b[i]),e[i+1]=d[i]=a[i]-i;
54   sort(e+1,e+n+2);
55   for(i=1;i<=n+1;i++)bit[i]=-N;
56   ins(lower(0),0);
57   for(i=1;i<=n;i++)g[i]=ans1,j=lower(d[i]),ins(j,f[i]=ask(j)+1);
58   ans0=ask(n+1);
59   for(i=0;i<=n;i++)G[i]=-1;
60   for(i=n;~i;i--)if(f[i]>=0)add(f[i],i);
61   for(i=0;i<ans0;i++){
62     j=G[i],k=G[i+1],m=0;
63     while(~j||~k){
64       if(j<0)h[++m]=E(k,1),k=nxt[k];
65       else if(k<0||j<k)h[++m]=E(j,0),j=nxt[j];
66       else h[++m]=E(k,1),k=nxt[k];
67     }
68     solve(1,m);
69     for(k=G[i+1];~k;k=nxt[k]){
70       g[k]+=b[k]+a[k]+1LL*k*(k-1)/2;
71       c[k]=g[k]+1LL*k*(k+1)/2-1LL*a[k]*k-a[k];
72     }
73   }
74   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);
75     printf("%d %lld",ans0,ans1);
76   return 0;
77 }

转载于:https://www.cnblogs.com/wsy01/p/8133823.html

bzoj2149拆迁队 斜率优化dp+分治相关推荐

  1. BZOJ 2149 拆迁队 斜率优化DP 主席树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...

  2. bzoj 2149 拆迁队 斜率优化+cdq分治

    题面 题目传送门 解法 从来没写过这样的-- 第一问非常简单,能够从 j j j转移到 i i i的条件显然为 a [ i ] − a [ j ] ≥ i − j a[i]-a[j]≥i-j a[i] ...

  3. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  4. 「APIO2010」 特别行动队 - 斜率优化Dp

    题目描述 你有一支由nnn名预备役士兵组成的部队,士兵从1到nnn编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,...,i+k) ...

  5. 【bzoj1911】[Apio2010]特别行动队 斜率优化dp

    题目描述 输入 输出 样例输入 4 -1 10 -20 2 2 3 4 样例输出 9 题解 斜率优化dp 设f[i]表示前i个士兵的战斗力之和的最大值. 那么有f[i]=f[j]+a*(sum[i]- ...

  6. [APIO2010]特别行动队——[斜率优化DP]

    [题目描述] 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i,i+1,. ...

  7. YbtOJ#493-最大分数【斜率优化dp,分治】

    正题 题目链接:http://172.17.55.160/contest/117/problem/1 题目大意 nnn个数的一个序列,给其中的一些数打上标记. 一个标记方案的贡献为s1s_1s1​表示 ...

  8. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 4142  Solved: 1964 [Submit][Sta ...

  9. 【BZOJ2149】拆迁队,分治+斜率优化DP

    传送门 思路还不错的一道题目,难度不大,但是我在写的时候出了一些细节上的错误 显然题目中的两问都可以通过DP来解决 f[i]f[i]表示保留旧房子ii时,1-i1-i最多能保留多少个旧房子 g[i]g ...

最新文章

  1. 基于i2c子系统的驱动分析
  2. 这可能是最简单易懂的机器学习入门
  3. 洛谷 P1028 数的计算
  4. 大数据算法:排位问题(2)
  5. 2016年定制维护组总结-历程回溯
  6. 8.局部变量/全局变量global/内嵌函数/闭包nonlocal
  7. 用户层CS段描述符信息
  8. Vue——整合EChart
  9. VTK:Rendering之StippledLine
  10. 分布领域驱动设计(DDD):领域接口化设计式缓存的选择
  11. python链表节点的插入p.next curnode_leetcode刷题总结之链表
  12. es创建索引库报错 :Types cannot be provided in put mapping requests, unless the include_type_na
  13. Ubuntu 18.04下搭建单机Hadoop和Spark集群环境
  14. 如何利用系统自带的小工具制作特殊字符
  15. requestparam注解_源码剖析@ApiImplicitParam对@RequestParam的required属性的侵入性
  16. 高级Java开发人员最常访问的几个网站
  17. 用指纹解锁数据!云盒子企业网盘,新增指纹认证功能
  18. 怎么复制window上的内容到linux,怎样将文件从window系统复制到远程linux系统上
  19. Word,Excel未保存,突然断电?找回死机后未储存的Word,Excel文件
  20. 20200924-OO

热门文章

  1. 7-5 寻找完美数* (30 分)
  2. java集合和数组随你转换_java集合和数组互转
  3. SQL语句插入日期格式数据
  4. 前后端分离重复提交_防止表单重复提交(二)
  5. English语法_时间副词
  6. Qt 3D使用攻略(4)-Qt3D之QML Types
  7. docker-compose部署6.8.23版本elasticsearch+es-head+kibana多节点集群及部分排错处理
  8. mysql 开启远程访问_开启mysql的远程访问权限
  9. 常见芯片封装有哪几种
  10. Spring中的 @Lazy注解