[BZOJ1584][Usaco2009 Mar]Cleaning Up 打扫卫生(dp+数学相关优化)
来源:互联网 发布:淘宝app框架 编辑:程序博客网 时间:2024/04/28 15:28
题目描述
传送门
题解
这题
然后利用一点数学知识就有一个非常巧妙的优化
这道题的答案是不会超过n的,所以要想最优的话,枚举的sum(l,r)不能超过
预处理pre(i),nxt(i)表示与位置i食物相同的前一个\下一个的位置
pos(j)表示[pos(j)+1,i]一共有j种不同的食物
那么
如何维护pos(j)呢?
记cnt(j)表示[pos(j),i]一共有多少种颜色
当i从i-1转移来时可以通过判断位置i的食物的pre来计算cnt(j)
如果cnt(j)>j即不合法,那么pos(j)要向后移动,直到把某一种颜色在区间中完全删除,这中间可以用nxt来判断
pos(j)单调移动,总时间复杂度
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 50005int n,m;int food[N],head[N],pre[N],tail[N],nxt[N],pos[N],cnt[N],f[N];int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;++i) scanf("%d",&food[i]); for (int i=1;i<=n;++i) pre[i]=-1,nxt[i]=n+1; for (int i=n;i>=1;--i) { if (head[food[i]]) pre[head[food[i]]]=i; head[food[i]]=i; } for (int i=1;i<=n;++i) { if (tail[food[i]]) nxt[tail[food[i]]]=i; tail[food[i]]=i; } memset(f,127,sizeof(f));f[0]=0; for (int i=1;i<=n;++i) { for (int j=1;j*j<=n;++j) if (pre[i]<=pos[j]) ++cnt[j]; for (int j=1;j*j<=n;++j) if (cnt[j]>j) { ++pos[j]; while (nxt[pos[j]]<=i) ++pos[j]; --cnt[j]; } for (int j=1;j*j<=n;++j) f[i]=min(f[i],f[pos[j]]+j*j); } printf("%d\n",f[n]);}
0 0
- [BZOJ1584][Usaco2009 Mar]Cleaning Up 打扫卫生(dp+数学相关优化)
- bzoj1584【Usaco2009 Mar】Cleaning Up 打扫卫生
- [bzoj1584] [Usaco2009 Mar]Cleaning Up 打扫卫生
- 【BZOJ1584】[Usaco2009 Mar]Cleaning Up 打扫卫生【DP】
- bzoj1584 [Usaco2009 Mar]Cleaning Up 打扫卫生 dp
- 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
- BZOJ 1584 [Usaco2009 Mar]Cleaning Up 打扫卫生 动态规划
- DP Cleaning Up 打扫卫生
- bzoj 1584 Cleaning Up 打扫卫生 dp
- bzoj1584 [ Usaco2009 Mar ] --DP
- [Usaco2009 Mar]Cleaning Up
- [bzoj1584]打扫卫生
- BZOJ 1584 [Usaco2009 Mar] Cleaning Up
- BZOJ1584 USACO 2009 Mar Gold 2.Cleaning Up
- [BZOJ3401][Usaco2009 Mar]Look Up 仰望(单调栈)
- bzoj3401[Usaco2009 Mar]Look Up 仰望
- [BZOJ3401] [Usaco2009 Mar]Look Up 仰望
- BZOJ 3401: [Usaco2009 Mar]Look Up 仰望
- day01
- day17:JavaScript DOM编程学习笔记08
- About Myself
- C++之vector容器初学
- SPOJ GSS1 - Can you answer these queries I(线段树维护GSS)
- [BZOJ1584][Usaco2009 Mar]Cleaning Up 打扫卫生(dp+数学相关优化)
- 未来我的学习计划
- Android深入源码分析理解Aidl整体调用流程(雷惊风)
- 【hibernate进阶】hql简单属性查询
- 用并查集判断是否是一棵树(1325)
- 初学者的Git浅谈
- 组合数学 POJ 1850 Code
- GazeTrackingFramework视线跟踪项目试用
- 集合嵌套之HashMap嵌套HashMap