题目: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的更多相关文章

  1. [BZOJ1786][BZOJ1831]逆序对

    [BZOJ1786][BZOJ1831]逆序对 试题描述 输入 输出 输入示例 - - 输出示例 数据规模及约定 见“输入” 题解 首先这题有一个性质,即,填的数从左到右一定不降.证明不妨读者自己yy ...

  2. BZOJ1786 [Ahoi2008]Pair 配对 动态规划 逆序对

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1786 题意概括 给出长度为n的数列,只会出现1~k这些正整数.现在有些数写成了-1,这些-1可以变 ...

  3. 【BZOJ1786】[Ahoi2008]Pair 配对 DP

    [BZOJ1786][Ahoi2008]Pair 配对 Description Input Output Sample Input 5 4 4 2 -1 -1 3 Sample Output 4 题解 ...

  4. bzoj1831: [AHOI2008]逆序对(DP+双精bzoj1786)

    1831: [AHOI2008]逆序对 Description 小可可和小卡卡想到Y岛上旅游,但是他们不知道Y岛有多远.好在,他们找到一本古老的书,上面是这样说的: 下面是N个正整数,每个都在1~K之 ...

  5. BZOJ1786: [Ahoi2008]Pair 配对/1831: [AHOI2008]逆序对

    这两道题是一样的. 可以发现,-1变成的数是单调不降. 记录下原有的逆序对个数. 预处理出每个点取每个值所产生的逆序对个数,然后dp转移. #include<cstring> #inclu ...

  6. 【BZOJ1786】[Ahoi2008]Pair 配对

    题解: 打表出奇迹 能发现所有ai一定是不减的 其实很好证明啊.. 考虑两个位置x y(y在x右边) x的最优值已经知道了 考虑y处 先让y=x,然后开始变化 因为x处已经是最优的了,所以如果减小,那 ...

  7. 洛谷 P4280 bzoj1786 [AHOI2008]逆序对(dp)

    题面 luogu bzoj 题目大意: 给你一个长度为\(n\)的序列,元素都在\(1-k\)之间,有些是\(-1\),让你把\(-1\)也变成\(1-k\)之间的数,使得逆序对最多,求逆序对最少是多 ...

  8. bzoj1786: [Ahoi2008]Pair 配对&&1831: [AHOI2008]逆序对

    一个自以为很对的东西,我们往-1放的数肯定是不增的. 然后就预处理一下,假如i这个位置放j会多多少逆序对. DP一下,我的复杂度应该是O(n*m^2)的,然而你随便搞都能省掉一个m吧,我算了算好像可以 ...

随机推荐

  1. Scala学习1

    Scala是一种静态语言.面向对象的函数式编程语言.它的程序代码以.scala结尾,编译时会编译成.class字节码在jvm上运行. 类和方法默认是public的,不必显式声明public. retu ...

  2. ASP.NET MVC4.0 部署

    EntifyFramework 5.0.0 安装 http://www.nuget.org/packages/EntityFramework/5.0.0 1. 文章,部署前的配置 http://www ...

  3. AngularJS和ReactJS对比

    Angular的特点: 优势: AngularJS是一套完整的框架,angular有自带的数据绑定.render渲染.angularUI库,过滤器,$filter,$directive(模板),$se ...

  4. mysql数据库优化[千万级查询]

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  5. 设计模式16---设计模式之组合模式(Composite)(行为型)

    1.场景模拟 使用软件模拟大树的根节点和树枝节点和叶子节点 抽象为两类,容器节点和叶子节点 2.不用模式的解决方案 package demo14.composite.example1; import ...

  6. google在线測试练习题1

    Problem You receive a credit C at a local store and would like to buy two items. You first walk thro ...

  7. Zend Framework学习日记(2)--HelloWorld篇(转)

    Zend Framework学习日记(2)--HelloWorld篇 这一篇主要演示如何用zf命令行工具建立一个基于Zend Framework框架的工程,也是我初学Zend Framework的小练 ...

  8. debian linux 中如何查看软件包是否已经安装和如何安装、卸载软件

    练习 1 方案:确定软件包是否安装 如果您不确定某个软件包是否已经安装,可以使用 dpkg 的 -l (L的小写) 选项: $ dpkg -l zsh No packages found matchi ...

  9. static——第一次执行与它以后执行时结果不一样

    void generate_initializer(char* string); int _tmain(int argc, _TCHAR* argv[]) { "}; ; i < ; ...

  10. c#中从string数组转换到int数组

    以前一直有一个数组之间转换的东西,可是忘记了,今天也是找了好久也没有解决,最后用这种方法解决了,分享给大家. " }; int[] output = Array.ConvertAll< ...