【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] ...
随机推荐
- qt 提高图片加载速度
一,将图片在pc上解析,然后将解析文件放到qrc文件中,读取qrc文件. 1,将图片解析后的二进制文件保存,源码如下, 下载地址:https://files.cnblogs.com/files/sen ...
- 课堂测试代码(未完全实现,部分代码有bug,仅供参考)
//信1705-3 20173507 周龙海package account; public class account { private String accountID; private Stri ...
- dropout——gluon
https://blog.csdn.net/lizzy05/article/details/80162060 from mxnet import nd def dropout(X, drop_prob ...
- git学习总结 - 纯命令
全局安装git: npm intall git -g 查看git版本: git --version 进入目录,初始化git: 若在目录中使用上一个,不在目录中使用下一个. //已有目录: git in ...
- The logback manual #01# Introduction
依赖包如下pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- self: 限制并发量asyncio
#coding:utf-8 import time,asyncio a=time.time() id=1 async def hello(id,semaphore): async with semap ...
- Kafka学习笔记之为什么使用Kafka
在介绍为什么使用kafka之前,我们有必要来了解一下什么是kafka? 0x00 什么是kafka Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐 ...
- 9i时候的块
Header (Common and Variable) The header contains general block information, such as the block addres ...
- Golang并发编程优势与核心goroutine及注意细节
Go语言为并发编程而内置的上层API基于CSP(communication sequential processes,顺序通信进程)模型.这就意味着显式锁都是可以避免的,比如资源竞争,比如多个进程同时 ...
- Nginx 容器教程
春节前,我看到 Nginx 加入了 HTTP/2 的 server push 功能,就很想试一下. 正好这些天,我在学习 Docker,就想到可以用 Nginx 容器.万一哪里改乱了,直接删掉,再重启 ...