此题题意我一次读不清 , 是不是要完……

题意: 给定一个数列, 修改其中的一些数,使得这个数列是严格递增的。并要求,修改的数尽量少(保留的数尽量多),并且代价尽量小。
代价的计算公式:修改完后所有数的和 + ∑ibi,数i没被修改 \sum\limits_{i} b_i , 数i 没被修改

第一问:
令 di=ai−i d_i = a_i - i 那么问题等价于求数列 d d 的最长不下降子序列。原因是这里要求严格递增, 而且数列中的每一项都不能删除,所以要留足够的位置给中间的数。
令 fif_i 表示 1 1 ~ ii 中保留数 i i 的前提下最多保留多少个数 ,这是个经典问题。

第二问:
显然这是个 dpdp 问题,我们先来看看怎样的 j j 能够更新 ii 。

j<i

j

dj≤di

d_j \le d_i

fj+1=fi

f_j + 1 = f_i

我们按照 f f 的大小分层 dpdp , 摆在我们面前的是个二维偏序问题。
我们可以用数据结构或者分治的方式来处理, 但是由于我们不能用一个集合 Sj S_j 去集中更新 i i 所以,到此为止我们算法的时间复杂度依然是 O(n2)O(n^2)

我们再观察 dp dp的转移方程( gi g_i是 i i 此时的 dpdp 值)

g[i]=min{d[j]∗i+g[j]−A[j]∗j−A[j]+j×(j+1)2}+i×(i−1)2+A[i]+B[i]

g[i]=min \{d[j]*i + g[j]-A[j]*j-A[j]+\frac{j\times(j+1)}{2} \}+\frac{i\times(i-1)}{2}+A[i]+B[i](摘自 这个小伙伴的博客)

我们令:

xj=dj,yj=g[j]−A[j]∗j−A[j]+j×(j+1)2

x_j = d_j\, , \, y_j = g[j]-A[j]*j-A[j]+\frac{j\times(j+1)}{2}

于是我们可以维护一个下凸包。
然而接下来的工作就看你如何处理二维偏序了, 如果你选择分治,可以先按下标排序,分治中再按 d d 排序, 每次更新时二分斜率或者三分值就可以啦。
时间复杂度可以是 O(nlog(n)2)O(n\log(n)^2) 或者 O(nlog(n)3) O(n\log(n)^3)

如果你选择维护可持久化凸包的话,可以先按 d d 排序, 然后用可持久化线段树维护这玩意,每次依然二分,这样可以做到 O(nlog(n)2)O(n\log(n)^2)

给一个思路清晰的 O(nlog(n)3) O(n\log(n)^3)的分治代码 , 换成归并排序即为 O(nlog(n)2) O(n\log(n)^2):

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const ll maxn = 1e5+1e2;
const ll INF = 0x3f3f3f3f3f3f3f3f;ll n , d[maxn] , f[maxn] , len[maxn] , ori[maxn]; ll g[maxn] , a[maxn] , b[maxn];
vector<int> level[maxn];ll *ss;
struct data
{ll k , id; ll x , y;data(){}data(ll k , ll id):k(k),id(id) { x = d[id]; y = g[id] - a[id]*id - a[id] + (id+1)*id/2; }bool operator <(const data& b) const { return ss[id] < ss[b.id] || (ss[id] == ss[b.id] && !k); }
}q[maxn]; ll m;void update(vector<data>& c , ll i)
{static ll l , r , len , ml , mr;l = 0 , r = (int)c.size()-1;while(l+4 < r){len = (r-l)/3; ml = l + len; mr = r - len;if(c[ml].x*i+c[ml].y > c[mr].x*i+c[mr].y) l = ml;else r = mr;}while(l <= r) g[i] = min(g[i] , c[l].x*i+c[l].y) , ++l;
}void solve(ll l , ll r)
{if(l == r) { if(q[l].k) { ll x = q[l].id; g[x] += a[x] + b[x] + (x-1)*x/2; } return; }ll mid = (l+r)/2;solve(l , mid);vector<data> qt , con;for(ll i=l;i<=mid;i++) if(!q[i].k) qt.push_back(q[i]);for(ll i=r;i>mid;i--)   if(q[i].k) qt.push_back(q[i]);sort(qt.begin() , qt.end());for(ll i=0;i<qt.size();i++) {data& j = qt[i];if(j.k) update(con , j.id);else {ll t = (int)con.size()-1;while(t>=1 && 1.0*(j.y - con[t].y) * (con[t].x - con[t-1].x) < 1.0*(con[t].y - con[t-1].y) * (j.x - con[t].x)) con.pop_back() , --t;con.push_back(j);}}solve(mid+1 , r);
}int main()
{#ifndef ONLINE_JUDGEfreopen("in","r",stdin);#endifcin>>n;for(ll i=1;i<=n;i++) scanf("%lld" , a+i) , d[i] = a[i] - i , ori[i] = i;for(ll i=1;i<=n;i++) scanf("%lld" , b+i);for(ll i=1;i<=n;i++) len[i] = INF , g[i] = INF; for(ll i=1;i<=n;i++) if(a[i] >= i){f[i] = upper_bound(len+1 , len+1+n , d[i]) - len;level[f[i]].push_back(i);len[f[i]] = min(len[f[i]] , d[i]);}level[0].push_back(0);for(ll i=1;;i++){if(level[i].empty()) {ll res = INF;for(ll j=0;j<level[i-1].size();j++) {ll k = level[i-1][j];res = min(res , g[k] + (a[k]*2 + 1 + n - k)*(n-k)/2);}cout<<i-1<<" "<<res<<endl; break;}m = 0;for(ll j=0;j<level[i-1].size();j++) q[++m] = data(0 , level[i-1][j]);for(ll j=0;j<level[i].size();j++) q[++m] = data(1 , level[i][j]);ss = ori; sort(q+1 , q+1+m); ss = d;solve(1 , m);}return 0;
}

BZOJ 2149 拆迁队相关推荐

  1. ●BZOJ 2149 拆迁队

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题解: 斜率优化DP,栈维护凸包,LIS,分治(我也不晓得是不是CDQ分治...) 一 ...

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

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

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

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

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

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

  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. 【分治+斜率优化】BZOJ2149拆迁队 CF660F Bear and Bowling 4

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

  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下载程序,自己就好奇进去下了些东西耍会.好多程序就是简简单单的一个网页,可用性不怎么样,所以基本都被我卸载了.现在还 ...

最新文章

  1. FPGA多功能应用处理器
  2. bind98-内网智能DNS之master服务器构建
  3. Python常用模块之subprocess模块
  4. “报复黑客”:可行的战略还是重大的风险?
  5. 如何获取如何获取datagrid复选框的值_未定事件簿泪之约定如何获取-未定事件簿泪之约定获取技巧...
  6. 《趣学CCNA——路由与交换》一2.3 网络层协议概述
  7. 我的前端工具集(五)提示工具之模态窗提示
  8. NOI数据结构:树套树
  9. 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。
  10. GitHub开源项目:用于构建接入网络和模块化网络服务的平台
  11. python学习手册-Python学习手册(第4版) 中文版.pdf
  12. 功率 dbm 和 mw 的换算
  13. Atitit 效率提升分析与解决方案 1. 三大模式 优化资源配置 通过降低难度 提升培训 1 1.1. 优化资源配置 1 1.2. 通过降低难度 1 1.3. 提升培训 1 2. 有效与立即可
  14. 2021.02.18 北师大寒假新生训练
  15. 图灵工业机器人说明书_图说人工智能:机器人极简史
  16. snyk 项目漏洞检测
  17. java获取iso周_java实现iso的周数计算
  18. python计算等额本金_等额本金还款计算公式
  19. 优漫动游做平面设计用什么显卡好?
  20. Java程序员找工作很难吗?可能没有get这些内容

热门文章

  1. lz医学院附属中医院出差总结
  2. Unity协程简述(简单用法,简易分析)
  3. 20171231:集合的框架、List集合及其实现类、迭代器的使用、Set集合的一部分内容
  4. python 列表去重及sort用法
  5. 史上最全Python学习笔记(基于《Python学习手册(第4版)》)——Part7 异常和工具
  6. java干洗店洗衣店管理系统_springboot_ssm_php
  7. JS忍者秘籍读书笔记(已完结)
  8. 技术前沿与经典文章35:诸葛亮千古奇文——全篇仅86字,道尽成大器秘诀
  9. JSP中page(也即this)对象与pageContext对象区别
  10. iapp开发的在线电影影视APP源码 带php后台