【BZOJ】1831: [AHOI2008]逆序对
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1831
考虑$-1$的位置上填写的数字一定是不降的。
令${f[i][j]}$表示$DP$到了第$i$位,最后一个$-1$上填的数字是$j$的最少逆序对数量。
如果当前位置是$-1$:
${f[i][j]=min\left \{ f[i-1][x] |x\leq j \right \}+ma[i][j+1]+mi[i][j-1]}$
如果当前位是确定的数字。
${f[i][j]=f[i-1][j]+ma[i][j+1]}$
其中${ma[i][j]}$表示在给定数组第$i$位之前的数字中大于等于$j$的数字的数量,${mi[i][j]}$表示在给定数组第$i$位之后的数字中小于等于$j$的数字的数量。
${ma,mi}$数组用树状数组维护一下即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 10010
#define llg long long
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,f[maxn][],val[maxn],V[maxn];
llg c[maxn]; llg lowbit(llg x){return x&-x;} void add(llg x,llg v){for (;x<=m;x+=lowbit(x)) val[x]+=v;} llg sum(llg x){llg tot=; for (;x>;x-=lowbit(x)) tot+=val[x]; return tot;} void add_(llg x,llg v){for (;x<=m;x+=lowbit(x)) V[x]+=v;} llg sum_(llg x){llg tot=; for (;x>;x-=lowbit(x)) tot+=V[x]; return tot;} int main()
{
yyj("bzoj1831");
cin>>n>>m;
for (llg i=;i<=n;i++)
for (llg j=;j<=m;j++)
f[i][j]=0x7fffffff;
for (llg i=;i<=n;i++)
{
scanf("%lld",&c[i]);
if (c[i]!=-) add_(c[i],);
}
f[][]=;
for (llg i=;i<=n;i++)
{
if (c[i]!=-)
{
for (llg j=;j<=m;j++) f[i][j]=f[i-][j]+sum(m)-sum(c[i]);
add_(c[i],-);
add(c[i],);
}
else
{
llg mi=f[i-][];
for (llg j=;j<=m;j++)
{
mi=min(f[i-][j],mi);
f[i][j]=mi+sum(m)-sum(j)+sum_(j-);
}
}
}
llg ans=0x7fffffff;
for (llg i=;i<=m;i++) ans=min(ans,f[n][i]);
cout<<ans;
return ;
}
【BZOJ】1831: [AHOI2008]逆序对的更多相关文章
- BZOJ 1831: [AHOI2008]逆序对
题目大意: 给出一个序列,有几个位置上的数字任意.求最小的逆序对数. 题解: 自己决定放置的数一定是单调不降的.不然把任意两个交换一下就能证明一定会增加逆序对. 然后就可以DP了,f[i][j]表示第 ...
- BZOJ1786: [Ahoi2008]Pair 配对/1831: [AHOI2008]逆序对
这两道题是一样的. 可以发现,-1变成的数是单调不降. 记录下原有的逆序对个数. 预处理出每个点取每个值所产生的逆序对个数,然后dp转移. #include<cstring> #inclu ...
- bzoj1786: [Ahoi2008]Pair 配对&&1831: [AHOI2008]逆序对
一个自以为很对的东西,我们往-1放的数肯定是不增的. 然后就预处理一下,假如i这个位置放j会多多少逆序对. DP一下,我的复杂度应该是O(n*m^2)的,然而你随便搞都能省掉一个m吧,我算了算好像可以 ...
- BZOJ1831: [AHOI2008]逆序对
1831: [AHOI2008]逆序对 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 341 Solved: 226[Submit][Status] ...
- bzoj1831: [AHOI2008]逆序对(DP+双精bzoj1786)
1831: [AHOI2008]逆序对 Description 小可可和小卡卡想到Y岛上旅游,但是他们不知道Y岛有多远.好在,他们找到一本古老的书,上面是这样说的: 下面是N个正整数,每个都在1~K之 ...
- 【BZOJ1831】[AHOI2008]逆序对(动态规划)
[BZOJ1831][AHOI2008]逆序对(动态规划) 题面 BZOJ 洛谷 题解 显然填入的数拎出来是不降的. 那么就可以直接大力\(dp\). 设\(f[i][j]\)表示当前填到了\(i\) ...
- BZOJ 3295 动态逆序对 | CDQ分治
BZOJ 3295 动态逆序对 这道题和三维偏序很类似.某个元素加入后产生的贡献 = time更小.pos更小.val更大的元素个数 + time更小.pos更大.val更小的元素个数. 分别用类似C ...
- 洛谷 P4280 bzoj1786 [AHOI2008]逆序对(dp)
题面 luogu bzoj 题目大意: 给你一个长度为\(n\)的序列,元素都在\(1-k\)之间,有些是\(-1\),让你把\(-1\)也变成\(1-k\)之间的数,使得逆序对最多,求逆序对最少是多 ...
- bzoj 3295 动态逆序对 CDQ分支
容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...
随机推荐
- avr定时器做的正弦波
2010-04-19 16:53:00 实物照片如下 RC电路的电阻为1K与10K时的波形分别如下 仿真图片如下: 程序如下: #include <iom16v.h> #include & ...
- 使用 ffmpeg 转换视频格式
ffmpeg 是 *nix 系统下最流行的音视频处理库,功能强大,并且提供了丰富的终端命令,实是日常视频处理的一大利器! 实例 flac 格式转 mp3 音频格式转换非常简单: ffmpeg -i i ...
- Delphi 如何访问监控摄像头?
源: Delphi 如何访问监控摄像头?
- Jquery autocomplete.js输入框联想补全功能
Jquery autocomplete.js插件下载地址:http://files.cnblogs.com/files/jinzhiming/autocomplete.rar 有两种用法,一种是直接使 ...
- 在nginx的http模块下面,一个server就可以看做一个站点,配置形式大概是这样的:
http { index index.php index.htm index.html; server { server_name www.site1.com; location / { # [... ...
- python简说(二十三)发邮件
import yagmailusername='uitestp4p@163.com'password='houyafan123'#生成授权码,qq.163.126都是授权码 mail_server = ...
- batchGetAnchorLevel(dubbo接口)
一.编写脚本前的准备工作 1.安装idea,安装本地maven库,并在idea里面配置maven 2.导入git源码(目的在于下载所依赖的基础包)-->File-new-Project from ...
- CocoaPods创建自己的公开库、私有库
http://www.cocoachina.com/ios/20180308/22509.html
- 使用JBarcode生成一维码
需要的jar包,只有jbarcode.jar 链接: https://pan.baidu.com/s/1o9oDPB8 密码: x367 public class Main { //设置条形码高度 p ...
- upc组队赛1 流连人间的苏苏
流连人间的苏苏 题目描述 苏苏在做红尘仙的任务时,发现坐落于风景秀丽.四季如春的昆明市的云南中医学院. 没过多久,苏苏就喜欢上了这个学校.以致于苏苏忘了回涂山的时间,现在她只剩下d天的时间待在云南中医 ...