当前位置: 首页 > news >正文

[BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)

显然有决策单调性,但由于逆序对不容易计算,考虑分治DP。

solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y]。暴力计算出(l+r)/2的决策位置s,两边递归下去继续操作。solve(k,x,s,l,mid-1),solve(k,s,y,mid+1,r)。

注意到每个位置每层只会被一个区间遍历到,加上树状数组在线更新逆序对的复杂度,总复杂度为$O(kn\log^2n)$

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
 4 using namespace std;
 5 
 6 const int N=40010,inf=1600000010;
 7 int n,m,a[N],f[20][N],c[N],l,r,cur;
 8 
 9 void add(int x,int k){ for (; x<=n; x+=x&-x) c[x]+=k; }
10 int que(int x){ int res=0; for (; x; x-=x&-x) res+=c[x]; return res; }
11 
12 void upd(int L,int R){
13     while (r<R) cur+=r-l+1-que(a[r+1]),add(a[++r],1);
14     while (l>L) cur+=que(a[l-1]),add(a[--l],1);
15     while (r>R) add(a[r--],-1),cur-=r-l+1-que(a[r+1]);
16     while (l<L) add(a[l++],-1),cur-=que(a[l-1]);
17 }
18 
19 void solve(int k,int x,int y,int l,int r){
20     if (l>r) return;
21     int mid=(l+r)>>1,id=min(mid-1,y);
22     f[k][mid]=inf;
23     for (int i=min(mid-1,y); i>=x; i--){
24         upd(i+1,mid);
25         if (f[k-1][i]+cur<=f[k][mid]) f[k][mid]=f[k-1][i]+cur,id=i;
26     }
27     solve(k,x,id,l,mid-1); solve(k,id,y,mid+1,r);
28 }
29 
30 int main(){
31     freopen("bzoj5125.in","r",stdin);
32     freopen("bzoj5125.out","w",stdout);
33     scanf("%d%d",&n,&m); l=1; r=0;
34     rep(i,1,n) scanf("%d",&a[i]);
35     rep(i,1,n) f[0][i]=inf;
36     rep(j,1,m) solve(j,0,n-1,1,n);
37     printf("%d\n",f[m][n]);
38     return 0;
39 }

 

转载于:https://www.cnblogs.com/HocRiser/p/10261963.html

相关文章:

  • IP 别名和辅助 IP 地址
  • python 使用多线程进行并发编程/互斥锁的使用
  • 树莓派Ubuntu 16.04 MATA系统 修改用户文件夹名后,提示configure it with blueman-service...
  • 基于websocket的单聊.群聊
  • Python(76)_装饰器进阶_带参数的装饰器
  • 烂泥分享的镜像下载地址
  • @RestControllerAdvice异常统一处理类失效原因
  • Webstorm 操作 HTML文件时的快捷键
  • 三次握手与四次挥手
  • Java使用RSA加密解密签名及校验
  • js操作字符串的一些方法(总结)
  • Error: Cannot retrieve repository metadata (repomd.xml) for repository: rpmforge.
  • python-----判断文件是否存在
  • Dynamic Web Module 4.0 requires Java 1.8 or newer.
  • 2019/1/19 Python今日收获
  • ES6语法详解(一)
  • Golang-长连接-状态推送
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript新鲜事·第5期
  • JS数组方法汇总
  • Just for fun——迅速写完快速排序
  • log4j2输出到kafka
  • React中的“虫洞”——Context
  • SOFAMosn配置模型
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vue 重置组件到初始状态
  • 数组大概知多少
  • 一个项目push到多个远程Git仓库
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #pragma 指令
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)可以带来幸福的一本书
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 设计模式初探
  • @private @protected @public
  • [04] Android逐帧动画(一)
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C++]:for循环for(int num : nums)
  • [C++基础]-入门知识
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [C语言]——柔性数组
  • [SP1043] GSS1 - Can you answer these queries I
  • [Spark][Hive]Hive的命令行客户端启动:
  • [SQL基础教程] 3-4 对查询结果进行排序/ORDER BY