bzoj 5125: [Lydsy1712月赛]小Q的书架

新学了一波 决策单调性 dp 套路。。。。
这种dp一般是长这样的 => f[i][j] = max/min { f[i-1][k] + cost(k+1,j)} ,其中cost函数满足四边形不等式。
其实这就可以看成是个多阶段决策,每一个阶段的f都是单调的;但因为f[i-1][k] + cost(k+1,j) 并不是单峰函数,所以我们不能通过单调队列做。
这个时候解决的方法就是通过分治 dfs(l,r,L,R) 表示 f[i][l~r] 只能从 f[i-1][L~R] 中转移过来,往下走的时候先暴力算出 mid=(l+r)>>1 的决策点 p,然后递归dfs(l,mid-1,L,p) 和 dfs(mid+1,r,p,R)。
本题的cost(l,r)是区间逆序对数,实在没有什么好的快速求的方法,只能暴力的类似莫队转移了hhhh
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=40005;
int n,a[maxn],F[maxn],f[maxn],G[maxn],k,ql,qr,cost;
inline void update(int x,int y){ for(;x<=n;x+=x&-x) f[x]+=y;}
inline int query(int x){ int an=0; for(;x;x-=x&-x) an+=f[x]; return an;} inline void Get(int l,int r){
while(ql>l) cost+=query(a[--ql]-1),update(a[ql],1);
while(qr<r) cost+=query(n)-query(a[++qr]),update(a[qr],1);
while(ql<l) update(a[ql],-1),cost-=query(a[ql++]-1);
while(qr>r) update(a[qr],-1),cost-=query(n)-query(a[qr--]);
} void dp(int l,int r,int L,int R){
if(l>r) return;
int mid=l+r>>1,MID; for(int i=min(mid,R+1);i>L;i--){
Get(i,mid);
if(G[i-1]+cost<F[mid]) F[mid]=G[i-1]+cost,MID=i-1;
} dp(l,mid-1,L,MID),dp(mid+1,r,MID,R);
}
int main(){
// freopen("data.in","r",stdin);
scanf("%d%d",&n,&k),ql=1,qr=n;
for(int i=1;i<=n;i++) scanf("%d",a+i),F[i]=F[i-1]+query(n)-query(a[i]),update(a[i],1);
cost=F[n];
for(int i=2;i<=k;i++){
memcpy(G,F,sizeof(F));
memset(F,0x3f,sizeof(F));
dp(1,n,0,n-1);
}
printf("%d\n",F[n]);
return 0;
}
bzoj 5125: [Lydsy1712月赛]小Q的书架的更多相关文章
- BZOJ5125: [Lydsy1712月赛]小Q的书架【决策单调性优化DP】【BIT】【莫队】【分治】
小Q有n本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小Q希望把这一排书分成恰好k段,使得每段至少有一本书,然后把每段按照现在的顺序依次放到k层书架的每一层上去.将所有书都放到 ...
- BZOJ5125: [Lydsy1712月赛]小Q的书架(DP决策单调性)
题意:N个数,按顺序划分为K组,使得逆序对之和最小. 思路:之前能用四边形不等式写的,一般网上都还有DP单调性分治的做法,今天也尝试用后者写(抄)了一遍.即: 分成K组,我们进行K-1次分治,get( ...
- 【BZOJ 5125】小Q的书架
Problem Description 小 \(Q\) 有 \(n\) 本书,每本书有一个独一无二的编号,现在它们正零乱地在地上排成了一排. 小 \(Q\) 希望把这一排书分成恰好 \(k\) 段,使 ...
- 【BZOJ】 4813: [Cqoi2017]小Q的棋盘
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4813 暴力转移就好,考虑以某一个点为根的子树分为是否走回来两种情况 ${f_{i,j}}$ ...
- bzoj 5072 [Lydsy1710月赛]小A的树——树形dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 发现对于每个子树,黑点个数确定时,连通块的大小取值范围一定是一段区间:所以考虑只最小化 ...
- BZOJ 5129: [Lydsy1712月赛]树上传送 点分树+Dijkstra
Description http://www.lydsy.com/JudgeOnline/upload/201712/prob12.pdf Input Output 暑假集训的时候点分树做的比较少,所 ...
- BZOJ5125 小Q的书架(决策单调性+动态规划+分治+树状数组)
设f[i][j]为前i个划成j段的最小代价,枚举上个划分点转移.容易想到这个dp有决策单调性,感性证明一下比较显然.如果用单调栈维护决策就不太能快速的求出逆序对个数了,改为使用分治,移动端点时树状数组 ...
- [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
显然有决策单调性,但由于逆序对不容易计算,考虑分治DP. solve(k,x,y,l,r)表示当前需要选k段,待更新的位置为[l,r],这些位置的可能决策点区间为[x,y].暴力计算出(l+r)/2的 ...
- [BZOJ 5072][Lydsy1710月赛]小A的树
传送门 \(\color{green}{solution}\) 嗯...其实我也不太会,所以大胆猜个结论吧(后来证了一下,然后放弃了...). 我们发现如果要使一个联通块的黑点数量为\(k\)的方案最 ...
随机推荐
- Aizu 2560 Point Distance FFT
题意: 有一个\(N \times N\)的方阵,第\(x\)行第\(y\)列有\(C_{x,y}\)个点\((0 \leq C_{x,y} \leq 9)\). 任选两个不同的点,求两点欧几里德距离 ...
- SQLAlchemy Script
SQLAlchemy: 1.由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 from sqlalchemy_utils impo ...
- IOS开发---菜鸟学习之路--(十三)-利用MBProgressHUD进行异步获取数据
本章将介绍如何利用MBProgressHUD实现异步处理数据. 其实我本来只是像实现一个加载数据时提示框的效果,然后问了学长知道了这个类,然后就使用了 接着就发现了一个“BUG” 再然后就发现原来MB ...
- xss games20关小游戏附源代码
1. get方式的的值直接输出来了. ?name=<script>alert(1)</script> 2. 同样没有过滤,不过需要闭合前边的双引号和>. "&g ...
- 小谈Bing桌面、Bing助手的现状与发展
Teamwork中我的工作,既然写了就直接放上来吧. 一.Bing搜索的相关背景 第一,必应搜索前几年的发展重点在于欧美市场,并且取得了一定的成效:根据 Hitwise 的统计数据,Bing 在 20 ...
- Resize operation completed for file#
Orale 12c RAC环境ALERT LOG中出现Resize operation completed for file# 查看数据库版本: BANNER CON_ID ------------- ...
- 【bzoj3295】[Cqoi2011]动态逆序对 线段树套SBT
题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...
- 论S B的自我修养 【2015/10/18更】
to do list: 1.正则表达式引擎 (done 2.五子棋AI jquery && canvas 游戏 (这个搞定好多好玩的idea可以实现了php 暂时不想玩各种框架吧, ...
- Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库
参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 ...
- Lis(bzoj 3532)
Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出 ...