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

贴个代码

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

bzoj2149拆迁队 斜率优化dp+分治的更多相关文章

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

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

  2. [APIO2010]特别行动队 --- 斜率优化DP

    [APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...

  3. APIO 2010 特别行动队 斜率优化DP

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

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

    正题 题目链接:http://www.ybtoj.com.cn/contest/117/problem/1 题目大意 \(n\)个数的一个序列,给其中的一些数打上标记. 一个标记方案的贡献为\(s_1 ...

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

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 5057  Solved: 2492[Submit][Statu ...

  6. BZOJ 1911 特别行动队(斜率优化DP)

    应该可以看出这是个很normal的斜率优化式子.推出公式搞一搞即可. # include <cstdio> # include <cstring> # include < ...

  7. luogu3628 特别行动队 (斜率优化dp)

    推出来式子以后斜率优化水过去就完事了 #include<cstdio> #include<cstring> #include<algorithm> #include ...

  8. bzoj1911 [Apio2010]特别行动队——斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1911 相当明显的斜率优化,很好做: 注意slp里面要有(double),以免出现精度问题. ...

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

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

随机推荐

  1. SQL之Left Join 关联条件的探讨

    在测试工作中,有时需要测试数据库数据经过sql计算后的结果是否满足某一功能查询得到的返回值. 针对某些需要功能需要联查多张表,此时 关联 的作用就异常重要了,而针对多表关联,其中 关联条件的重要性不言 ...

  2. 北亚关于HP EVA4400/6400/8400/P6000的数据恢复解决方案

    [引言]本文档建立在针对HP EVA的大量测试性研究基础上,所有的细节几乎均为对EVA的破译型研究,目前全球范围内尚未发现类似资料,故可能表述方式和结论并不精确,仅为参考之用.我们公司为研究HP EV ...

  3. JAVA_SE基础——36.static的实际应用

    什么时候定义静态函数 如果功能内部没有访问到非静态数据(对象的特有数据.那么该功能就可以定义为静态) P.S. 静态方法作为类和接口的重要组成部分,可以通过类名或接口直接访问,通常将那些使用频率较高的 ...

  4. ctf变量覆盖漏洞:

    1.变量覆盖: ①:针对extract函数的变量覆盖漏洞: <?php @error_reporting(E_ALL^E_NOTICE); require('config.php'); if($ ...

  5. C# 使用 GDI+ 画图

    最近做一个微信公众号服务,有一些简单的图片处理功能.主要就是用户在页面操作,前端做一些立刻显示的效果,然后提交保存时后端真正修改原图. 我们的后端是 ASP.NET,也就是 C# 语言了,C# 本身处 ...

  6. Ubuntu 17.10.1安装, 定制

    p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 2018.4.7 Ubuntu 17.10.1安装, 定制, 后续搭建LAMP环境 ...

  7. 在WebStorm中启动Angular项目

    点击配置 创建 选择命令 package.json 运行 查看运行结果

  8. Tomcat性能优化及JVM内存工作原理

    Java性能优化原则:代码运算性能.内存回收.应用配置(影响Java程序主要原因是垃圾回收,下面会重点介绍这方面) 代码层优化:避免过多循环嵌套.调用和复杂逻辑. Tomcat调优主要内容如下: 1. ...

  9. Python内置函数(54)——callable

    英文文档: callable(object) Return True if the object argument appears callable, False if not. If this re ...

  10. Spring Security 入门(3-11)Spring Security 的登录密码验证过程 UsernamePasswordAuthenticationFilter

    认证过程如下 一.先判断请求(请求必须是post请求)地址是否为配置的 login-processing-url 值(默认/j_spring_security_check),如果不是,则放行,进入下一 ...