bzoj1786
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1786
刚看上去觉得挺吓人的。。。。。。
冥冥之中我的内心深处告诉我填进去的数一定是非严格递增的。
结果真的是这样:

对于两个相邻的未填数字x和y,不管我们怎么交换x和y,影响的只是红色框里面的,我们把红色框单独取出来。
不妨设x<y。
我们把红色框里面的数拍一下序(因为有可能有多个x和y,所以写多了几个,不影响结果)

如果x和y不交换,那么逆序对个数为红色线覆盖的个数
如果x和y交换,那么逆序对个为蓝色线覆盖的个数+1
很明显很明显不交换比交换优
所以填进去的数一定是非严格递增的。
知道的了这个,就很简单了,求出val[i][j],表示第i个空位填j的时候会产生多少个逆序对,这个可以用树状数组解决。
然后就继续求解。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define re(i,a,b) for(i=a;i<=b;i++)
#define red(i,a,b) for(i=a;i>=b;i--)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} const DB EPS=1e-;
inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); inline int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
inline LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxN=;
const int maxK=; int N,K,M;
int a[maxN+];
int idx[maxN+];
int val[maxN+][maxK+];
int F[maxN+][maxK+];
int ans; #define lowbit(a) (a&(-a))
int tree[maxK+];
inline void update(int a){for(;a<=K;a+=lowbit(a))tree[a]++;}
inline int ask(int a){int res=;for(;a>=;a-=lowbit(a))res+=tree[a];return res;} int main()
{
freopen("bzoj1786.in","r",stdin);
freopen("bzoj1786.out","w",stdout);
int i,j;
N=gint();K=gint();
re(i,,N)a[i]=gint();
re(i,,N)if(a[i]==-)idx[i]=++M;
mmst(tree,);re(i,,N)if(a[i]!=-)update(K-a[i]+);else re(j,,K) val[idx[i]][j]+=ask(K-j);
mmst(tree,);red(i,N,)if(a[i]!=-)update(a[i]); else re(j,,K)val[idx[i]][j]+=ask(j-);
re(j,,K)F[][j]=val[][j];
re(i,,M)
{
F[i][]=F[i-][]+val[i][];
re(j,,K) F[i][j]=min(F[i-][j],F[i][j-]-val[i][j-])+val[i][j];
}
ans=F[M][];re(j,,K)upmin(ans,F[M][j]);
mmst(tree,);re(i,,N)if(a[i]!=-){ans+=ask(K-a[i]);update(K-a[i]+);}
cout<<ans<<endl;
return ;
}
bzoj1786的更多相关文章
- [BZOJ1786][BZOJ1831]逆序对
[BZOJ1786][BZOJ1831]逆序对 试题描述 输入 输出 输入示例 - - 输出示例 数据规模及约定 见“输入” 题解 首先这题有一个性质,即,填的数从左到右一定不降.证明不妨读者自己yy ...
- BZOJ1786 [Ahoi2008]Pair 配对 动态规划 逆序对
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1786 题意概括 给出长度为n的数列,只会出现1~k这些正整数.现在有些数写成了-1,这些-1可以变 ...
- 【BZOJ1786】[Ahoi2008]Pair 配对 DP
[BZOJ1786][Ahoi2008]Pair 配对 Description Input Output Sample Input 5 4 4 2 -1 -1 3 Sample Output 4 题解 ...
- bzoj1831: [AHOI2008]逆序对(DP+双精bzoj1786)
1831: [AHOI2008]逆序对 Description 小可可和小卡卡想到Y岛上旅游,但是他们不知道Y岛有多远.好在,他们找到一本古老的书,上面是这样说的: 下面是N个正整数,每个都在1~K之 ...
- BZOJ1786: [Ahoi2008]Pair 配对/1831: [AHOI2008]逆序对
这两道题是一样的. 可以发现,-1变成的数是单调不降. 记录下原有的逆序对个数. 预处理出每个点取每个值所产生的逆序对个数,然后dp转移. #include<cstring> #inclu ...
- 【BZOJ1786】[Ahoi2008]Pair 配对
题解: 打表出奇迹 能发现所有ai一定是不减的 其实很好证明啊.. 考虑两个位置x y(y在x右边) x的最优值已经知道了 考虑y处 先让y=x,然后开始变化 因为x处已经是最优的了,所以如果减小,那 ...
- 洛谷 P4280 bzoj1786 [AHOI2008]逆序对(dp)
题面 luogu bzoj 题目大意: 给你一个长度为\(n\)的序列,元素都在\(1-k\)之间,有些是\(-1\),让你把\(-1\)也变成\(1-k\)之间的数,使得逆序对最多,求逆序对最少是多 ...
- bzoj1786: [Ahoi2008]Pair 配对&&1831: [AHOI2008]逆序对
一个自以为很对的东西,我们往-1放的数肯定是不增的. 然后就预处理一下,假如i这个位置放j会多多少逆序对. DP一下,我的复杂度应该是O(n*m^2)的,然而你随便搞都能省掉一个m吧,我算了算好像可以 ...
随机推荐
- Hello,world,l'm coming!
#include<studio.h> int main() { printf("Hello,Word!" l'm coming\n"); return0; }
- OSI七层结构
- MAC安装SVNServer
MAC已经自带了SVN,所以,直接使用就好 1.创建svn repository svnadmin create /path/svn/pro //仓库位置,svn是svn的目录,pro是一个版本库的 ...
- # linux下安装Nodejs环境
1.下载二进制文件到本地 root@ubuntu:/home/zhu/Downloads# node-v6.3.1-linux-x64.tar.xz 2.解压文件到当前文件夹 root@ubuntu: ...
- USB HID Report Descriptor 报告描述符详解
Report descriptors are composed of pieces of information. Each piece of information is called an Ite ...
- 【回顾整理】暴走的SQL语句练习!!!
设计一个学生成绩数据库,该库包含学生,老师,课程和成绩等信息并完成后面的练习.学生:学号(SNO).姓名(SNAME).性别(SSEX).生日(SBIRTHDAY ).所属班级(SCLASS )课程: ...
- u盘启动盘制作工具
u盘启动盘制作工具http://www.dabaicai.biz/ 系统镜像文件下载:http://xt.qingdiangongsi.cn/xtxz/
- GridView格式化数据DataFormatString
设定BoundField的DataFormatString,通常有以下几种 DataFormatString= "{0:C}" 货币,货币的格式取决于当前Thread中Cultur ...
- jQuery选择器 之详述
jQuery选择器 一. 单词小计 Pervious 上一页sibling 同级first 第一last 最后not 不 Even 偶数 odd 奇数 header 页眉 一.jQ ...
- JQ 遍历节点
.children() : 取得匹配元素的子元素集合 .next() :取得匹配元素后面紧邻的同辈元素 .prev() :取得匹配元素前面紧邻的同辈元素 .siblings() :取得匹配元素前.后的 ...