BZOJ1831: [AHOI2008]逆序对
1831: [AHOI2008]逆序对
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 341 Solved: 226
[Submit][Status]
Description
Input
Output
Sample Input
4 2 -1 -1 3
Sample Output
HINT
4 2 4 4 3中有4个逆序对。当然,也存在其它方案得到4个逆序对。
数据范围:
100%的数据中,N<=10000,K<=100。
60%的数据中,N<=100。
40%的数据中,-1出现不超过两次。
Source
题外话:
{
刚开始看错题了,看成100%数据-1不超过2个,于是想这不是sb暴力吗?于是就开始敲代码,敲完之后就悲剧了。。。
结果发现不会做。。。
一看题解忽然明白了,我靠怎么还有这样一个性质,那就是 DP了。。。自己想的时候没想到DP QAQ。。。
}
题解:考虑一般情况 -1有很多,爆搜就不行了,那么应该如何下手呢?
联想学过的知识,大概只有DP可以用了
但怎么DP呢?
这些填的数应该有什么性质---一列数能有什么性质?大概就是递增递减吧。。。
(吐槽:这思路也太牵强了吧。。。回答:。。。。。。)
下面我们考虑两个空 a,b ,分别填上了x,y (假设只有两个空,并且x>y)
如果我们交换 x 和 y 那么会有这样几条性质:
1.[1,a-1],[b+1,n]中的数与x,y构成的逆序对没有发生改变
2.[a+1,b-1]中 >max(x,y)的数与x,y构成的逆序对没有发生改变
3.[a+1,b-1]中 < min(x,y)的数与x,y构成的逆序对没有发生改变
4.[a+1,b-1]中处于区间(x,y)的数不再与x,y构成逆序对
5.x,y不再构成逆序对
也就是说我们交换x,y得到的答案一定会减小!
稍微推广一下就是 这些填的数单调递增,但不一定是严格的
考虑实现
for i=1 to n do
for j=1 to k do
for p=1 to j do
f[i,j]=min(f[i,j],f[i-1,p]+cost(i,j))
NO NO NO
既然考虑到cost(i,j)是固定的,我们只需要求f[i-1,1],f[i-1,2]......f[i-1,j]的最小值即可
前缀最小值优化!类似于前缀和。。。
这样状态数一共有O(N*K)个,每个状态的转移的复杂度为O(1)
代码:
var f,g,big,sma:array[..,..] of longint;
ans,i,j,n,tot,k:longint;
a,b:array[..] of longint;
function min(x,y:longint):longint;
begin
if x<y then exit(x) else exit(y);
end;
procedure init;
begin
readln(n,k);tot:=;
for i:= to n do
begin
read(a[i]);
if a[i]=- then begin inc(tot);b[tot]:=i;end;
end;
end;
procedure main;
begin
fillchar(big,sizeof(big),);
for i:= to n do
for j:= to k do big[i,j]:=big[i-,j]+ord(a[i]>j);
fillchar(sma,sizeof(sma),);
for i:=n downto do
for j:= to k do sma[i,j]:=sma[i+,j]+ord((a[i]<j) and (a[i]<>-));
fillchar(f,sizeof(f),);
for i:= to tot do
begin
f[i,]:=f[i-,]+big[b[i],]+sma[b[i],];
g[i,]:=f[i,];
for j:= to k do
begin
f[i,j]:=g[i-,j]+big[b[i],j]+sma[b[i],j];
g[i,j]:=min(g[i,j-],f[i,j]);
end;
end;
ans:=maxlongint;
for i:= to k do ans:=min(ans,f[tot,i]);
for i:= to n do inc(ans,big[i,a[i]]);
writeln(ans);
end;
begin
assign(input,'input.txt');assign(output,'output.txt');
reset(input);rewrite(output);
init;
main;
close(input);close(output);
end.
BZOJ1831: [AHOI2008]逆序对的更多相关文章
- bzoj1831: [AHOI2008]逆序对(DP+双精bzoj1786)
1831: [AHOI2008]逆序对 Description 小可可和小卡卡想到Y岛上旅游,但是他们不知道Y岛有多远.好在,他们找到一本古老的书,上面是这样说的: 下面是N个正整数,每个都在1~K之 ...
- 【BZOJ1831】[AHOI2008]逆序对(动态规划)
[BZOJ1831][AHOI2008]逆序对(动态规划) 题面 BZOJ 洛谷 题解 显然填入的数拎出来是不降的. 那么就可以直接大力\(dp\). 设\(f[i][j]\)表示当前填到了\(i\) ...
- 【BZOJ】1831: [AHOI2008]逆序对
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1831 考虑$-1$的位置上填写的数字一定是不降的. 令${f[i][j]}$表示$DP$到 ...
- BZOJ1786: [Ahoi2008]Pair 配对/1831: [AHOI2008]逆序对
这两道题是一样的. 可以发现,-1变成的数是单调不降. 记录下原有的逆序对个数. 预处理出每个点取每个值所产生的逆序对个数,然后dp转移. #include<cstring> #inclu ...
- 【[AHOI2008]逆序对】
被锤爆了 被这个题搞得自闭了一上午,觉得自己没什么前途了 我又没有看出来这个题的一个非常重要的性质 我们填进去的数一定是单调不降的 首先如果填进去的数并不是单调不降的,那么填进去本身就会产生一些逆序对 ...
- [AHOI2008] 逆序对
link 我们可以很容易的推断出$-1$是单调不降的,若$i>j$且$a_i$与$a_j$都没有填数,若填完之后$a_i>a_j$或者$a_i<a_j$,则对答案产生影响的只在$[i ...
- 洛谷 P4280 bzoj1786 [AHOI2008]逆序对(dp)
题面 luogu bzoj 题目大意: 给你一个长度为\(n\)的序列,元素都在\(1-k\)之间,有些是\(-1\),让你把\(-1\)也变成\(1-k\)之间的数,使得逆序对最多,求逆序对最少是多 ...
- [AHOI2008]逆序对(dp)
小可可和小卡卡想到Y岛上旅游,但是他们不知道Y岛有多远.好在,他们找到一本古老的书,上面是这样说的: 下面是N个正整数,每个都在1~K之间.如果有两个数A和B,A在B左边且A大于B,我们就称这两个数为 ...
- BZOJ 1831: [AHOI2008]逆序对
题目大意: 给出一个序列,有几个位置上的数字任意.求最小的逆序对数. 题解: 自己决定放置的数一定是单调不降的.不然把任意两个交换一下就能证明一定会增加逆序对. 然后就可以DP了,f[i][j]表示第 ...
随机推荐
- 实战突击: Java Web项目整合开发(PDF)
实战突击: Java Web项目整合开发(PDF)
- Cocos2d-x 3.0坐标系详解(转载)
Cocos2d-x 3.0坐标系详解 Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenG ...
- [翻译][MVC 5 + EF 6] 3:排序、过滤、分页
原文:Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application 1.添加排序: 1. ...
- spark-shell - 将结果保存成一个文件
sqlContext.sql(""" SELECT user_no,cust_id,oper_code FROM cui.operation_data_an ...
- SimpleXML解析xml文件
SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式. 与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据. Simp ...
- yii2 AR需要注意的地方
$model::find(['id'=>1])->one();和$model::findOne(1); 返回的都是一个Obj不能使用foreach遍历,其他都是返回对象数组可以用forea ...
- linux 下C语言编程库文件处理与Makefile编写
做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...
- 详解 CSS 属性 - 伪类和伪元素的区别[转]
首先,阅读 w3c 对两者的定义: CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果 ...
- nexus3添加第三方jar
最近在看maven的打包及管理,然後就看到nexus,自己在安裝的時候就下載了最新版的nexus-3.2.0-01-win64,按照文档部署后启动,浏览.之前一致使用的是2.0的,所以还是需要导出点点 ...
- 单片微机原理P0:80C51结构原理
本来我真的不想让51的东西出现在我的博客上的,因为51这种东西真的太low了,学了最多就所谓的垃圾科创利用一下,但是想一下这门课我也要考试,还是写一点东西顺便放博客上吧. 这一系列主要参考<单片 ...