BZOJ 1786: [Ahoi2008]Pair 配对 题解
来源:互联网 发布:bbs论坛数据库设计 编辑:程序博客网 时间:2024/05/18 18:52
【原题】
1786: [Ahoi2008]Pair 配对
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 399 Solved: 241
[Submit][Status]
Description
Input
Output
Sample Input
5 4
4 2 -1 -1 3
4 2 -1 -1 3
Sample Output
4
HINT
Source
Day1
【分析】一看到就感觉有思路,好像-1的格子有什么规律。于是开始YY。
简单的脑补:设A,B,C三个点,A,C是-1。显然,A、C的大小关系和A左边、B右边的无关。
若A<=C。如果B>C逆序对就是1 ,否则是0。
若A>C。如果B>C逆序对就是2 ,否则是1。
显然-1的格子是单调上升的最好。
然后的DP真的是太水了。先求出原来数的逆序对个数,然后只考虑-1的点造成的逆序对增量。
设f[i][j]是到第i个-1的点,改成数字j的最少逆序增量。显然f[i][j]=min(f[i-1][k]+cost)。而代价是1--i中比j大的数和i+1--n中比j小的数的和。可以先预处理出来。
还有,根据这个方程,除了状压外,还可以把时间效率从NK^2压成NK。
【造数据程序】无限WA!于是就找了个标程对拍。
#include<cstdio>#include<cstdlib>#include<ctime>using namespace std;int main(){ freopen("1786.in","w",stdout); srand((int)time(0)); int n=1000,k=100; printf("%d %d\n",n,k); for (int i=1;i<=n;i++) { int num=rand()%10; if (!num) printf("-1 ");else printf("%d ",rand()%10+1); } return 0;}
好不容易发现错误:最后更新Min的时候我用f数组。看上去因为f和g是一样的(memcpy),但其实如果-1只有1个,就不会有f了,而边界条件是g。于是应该改用g来更新Min。
【代码】
#include<cstdio>#include<algorithm>#include<cstring>#define N 10005#define K 105using namespace std;int place[N],big[N][K],small[N][K],f[K],g[K],a[N];int n,L,i,j,m,now,last,ans,Min;int main(){ freopen("1786.in","r",stdin); freopen("1786.out","w",stdout); scanf("%d%d",&n,&L); for (i=1;i<=n;i++) {scanf("%d",&a[i]);if (a[i]==-1) place[++m]=i;} for (i=2;i<=n;i++) { memcpy(big[i],big[i-1],sizeof(big[i-1])); if (a[i-1]>-1) for (j=1;j<a[i-1];j++) big[i][j]++; } for (i=n-1;i;i--) { memcpy(small[i],small[i+1],sizeof(small[i+1])); if (a[i+1]>-1) for (j=L;j>a[i+1];j--) small[i][j]++; } for (i=1;i<=n;i++) if (a[i]>-1) ans+=small[i][a[i]]; for (i=1;i<=L;i++) g[i]=big[place[1]][i]+small[place[1]][i]; for (i=2;i<=m;i++) { for (last=2;last<=L;last++) g[last]=min(g[last],g[last-1]); for (now=1;now<=L;now++) f[now]=g[now]+big[place[i]][now]+small[place[i]][now]; memcpy(g,f,sizeof(f)); } Min=g[1];for (i=2;i<=L;i++) Min=min(Min,g[i]); printf("%d",ans+Min); return 0;}
2 1
- BZOJ 1786: [Ahoi2008]Pair 配对 题解
- 【bzoj 1786】[Ahoi2008]Pair 配对
- bzoj 1786 [Ahoi2008]Pair 配对
- bzoj 1786 && bzoj 1831: [Ahoi2008]Pair 配对(DP)
- BZOJ1786: [Ahoi2008]Pair 配对
- bzoj1786: [Ahoi2008]Pair 配对
- BZOJ 1786 配对Pair
- bzoj1786&1831[Ahoi2008]Pair 配对
- BZOJ 1787 [Ahoi2008]Meet 紧急集合 题解
- BZOJ 1787 [Ahoi2008]Meet紧急集合 题解与分析
- 【BZOJ】【P1787】【AHOI2008】【Meet 紧急集合】【题解】【LCA】
- 【BZOJ】【P1830】【AHOI2008】【Y型项链】【题解】【乱搞】
- BZOJ P1832[AHOI2008]聚会
- BZOJ [Ahoi2008]Meet 紧急集合
- BZOJ 1832: [AHOI2008]聚会|Lca
- bzoj 1831: [AHOI2008]逆序对
- bzoj 1832: [AHOI2008]聚会 lca
- bzoj 1787 [Ahoi2008]Meet 紧急集合(1832 [AHOI2008]聚会)
- 简单获取数据库连接串
- leetcode:Triangle
- NanShan 如何解决DotProject中文乱码问题
- 五个字乘以4等于倒过来的值,四个字乘以4等于倒过来的值
- JavaBean的简单用法
- BZOJ 1786: [Ahoi2008]Pair 配对 题解
- 公历转农历的程序(代码转载于网络)
- NYOJ 题目25 A Famous Music Composer
- LNK2019,LNK1120一个可能编译时产生函数声明与实现不对称的误导提示信息的问题
- AJAX
- 忙碌与黑色的六月-告别我的青春
- 解决 软件包 org.cocos2dx.lib 不存在
- 一个职场人的素养--但求问心无愧
- Plugins (Pro/Mobile-Only Feature)