哇,难受得一匹.

看到题的一瞬间竟然只想到了\(n^3\)的区间\(DP\)

一.\(40pts\)

设\(f[i][j]\)代表删去\(i\)到\(j\)这一段区间的最小代价和.

然后直接写普通的区间\(DP\)即可.

for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
{
f[i][j]=abs(a[j]-a[i]);
for(int k=i+1;k<j-1;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
二.\(70pts\)

设\(f[i]\)代表删去\(1\)到\(i\)这一段的最小代价和.

两分钟写的比考试的时候写到的要得分高qwq

然后\(n^2\)枚举即可.

for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
f[i]=min(f[i],f[j-1]+abs(a[j]-a[i]));
三.\(100pts\)

考虑优化,我们的状态转移的第二项会有两种情况.

这里设\(A=a[i]\),\(B=a[j]\)。

\(abs\)会出现两种情况

\[f[i]=f[j-1]+A-B\ (A\leq B)\\f[i]=f[j-1]+B-A\ ( B<A)
\]

此时\(A\)已知,因此维护两个东西.

  1. \(f[j-1]+B\)
  2. \(f[j-1]-B\)

用什么维护?发现这个东西是前缀,所以考虑树状数组

维护的东西就是上面的,然后每次询问之后,再加入\(f[i-1]+A\)与\(f[i-1]-B\)

PS:这里要开两个树状数组,具体看代码。

注意其中一个树状数组要反转.

代码

#include<cstdio>
#include<cctype>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#define N 500008
#define R register
#define clear(a,b) memset(a,b,sizeof a)
#define int long long
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int f[N],a[N],n,b[N];
#define lowbit(o) o&-o
int aa[N],bb[N];
inline void adda(int o,int x)
{
for(;o<=n;o+=lowbit(o))
aa[o]=min(aa[o],x);
}
inline void addb(int o,int x)e
{
o=n-o+1;
for(;o<=n;o+=lowbit(o))
bb[o]=min(bb[o],x);
}
inline int querya(int o)
{
R int res=214748364000LL;
for(;o;o-=lowbit(o))
res=min(res,aa[o]);
return res;
}
inline int queryb(int o)
{
R int res=214748364000LL;
o=n-o+1;
for(;o;o-=lowbit(o))
res=min(res,bb[o]);
return res;
}
signed main()
{
freopen("remove.in","r",stdin);
freopen("remove.out","w",stdout);
in(n);
for(R int i=1;i<=n;i++)in(a[i]),b[i]=a[i];
sort(b+1,b+n+1);
for(R int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+n+1,a[i])-b;
clear(f,0x3f);f[0]=0;
clear(bb,0x3f),clear(aa,0x3f);
for(R int i=1;i<=n;i++)
{
int tma=querya(a[i]),tmb=queryb(a[i]);
f[i]=min(f[i],b[a[i]]+tma);
f[i]=min(f[i],-b[a[i]]+tmb);
adda(a[i],f[i-1]-b[a[i]]);
addb(a[i],f[i-1]+b[a[i]]);
}
printf("%lld",f[n]);
}

树状数组优化DP 【模拟赛】删区间的更多相关文章

  1. Codeforces 946G Almost Increasing Array (树状数组优化DP)

    题目链接   Educational Codeforces Round 39 Problem G 题意  给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数. ...

  2. HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)

    题目链接  2017 CCPC Harbin Problem K 题意  给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...

  3. LUOGU P2344 奶牛抗议 (树状数组优化dp)

    传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...

  4. 【题解】Music Festival(树状数组优化dp)

    [题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...

  5. 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)

    [题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...

  6. 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp

    显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...

  7. Codeforces 909C Python Indentation:树状数组优化dp

    题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...

  8. BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  9. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  10. BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)

    分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...

随机推荐

  1. C#范型实例化对象

    T s = System.Activator.CreateInstance<T>();

  2. 【NOIP模拟赛】beautiful 乱搞(平衡树)+ST

    biubiu~~~ 我用平衡树处理的这道题,然而这种方法还是要看评测姬..... 正解是乱搞....就是枚举每一位数作为中位数,比他小的看做-1比他大的看做1,那么我们从一开始就有了一个绵延的山,我们 ...

  3. oralce的客户端sqlplus

    安装完oracle后,默认的客户端是sqlplus,还有一个公司常用的是PLSQLdeveloper 客户端软件,另外Navicat primie这个可以连接mysql.sqlserver.oracl ...

  4. 栈与递归的实现(Hanoi塔问题等等)

    函数中有直接或间接地调用自身函数的语句,这样的函数称为递归函数.递归函数用 得好,可简化编程工作.但函数自己调用自己,有可能造成死循环.为了避免死循环,要 做到两点: (1) 降阶.递归函数虽然调用自 ...

  5. 封装常用的Javascript跨浏览器方法

    var EventUntil={ // 跨浏览器的添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListen ...

  6. ListView使用--文章集锦

    详解ListView加载网络图片的优化,让你轻松掌握! ListView具有多种item布局--实现微信对话列 关注公众号,分享干货,讨论技术

  7. Ubuntu下kafka集群环境搭建及测试

    kafka介绍: Kafka[1是一种高吞吐量[2]  的分布式发布订阅消息系统,有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能 ...

  8. 【SPOJ-QTREE】树链剖分

    树链剖分学习 https://blog.csdn.net/u013368721/article/details/39734871 https://www.cnblogs.com/George1994/ ...

  9. 关于dlib人脸对比,人脸识别

    人脸检测 人脸特征点提取 人脸对比,等于两张人脸对比,识别 封装的所有识别函数,直接看下面调用就好了. # coding:utf-8 ''' 本本次封装,我主要是做两张人脸对比. 就只人脸识别部分,简 ...

  10. 也说JS脚本加载控制

    问题背景 前端采用的 iframe + html 做后台管理系统.现在js.jquery插件非常多,每次页面都是引用就类似这样: <script src="../Scripts/jqu ...