usaco 打扫食槽
Description
从前奶牛是不挑食的,但现在世道变了,她们变得非常挑剔。牧场里有N头奶牛,约翰 要向她们提供M种食物,第i头奶牛只会吃Pi号食物。
约翰每天都要打扫食槽,这件事非常累。奶牛沿着食槽排成一条直线,约翰在打扫时, 可以将食槽分割成若干个区间,如果一段区间中有K种不同的食物,那么这段区间打扫的时 间就是K2。请帮助约翰计划一下,怎么样才能使打扫整个食槽的时间最少。
Input Format
第一行:两个用空格分开的整数:N和M,1 ≤ M ≤ N ≤ 40000
第二行到N + 1行:第i + 1行有一个整数Pi,1 ≤ Pi ≤ M
Output Format
第一行:单个整数,表示约翰完成打扫的最短时间
-----------------------------------------------------------
正解 = 动归- =
考虑裸Dp :
状态 :f[i]表示到 i 这个头牛时,打少至少需要的时间
转移 :f[i]=min(f[j],cal(j+1,i)^2) (cal(j+1,i)=>从 j+1 到 i ) 食物种类数。
直接进行计算需要 O(n^3)
预处理cal 则需要 O (n^2)
对于 N 的数据范围,这两种算法显然都不尽如人意
考虑一种新的转移
现看成一个染色问题- =,
设数为 pos[i] 为取 i 种颜色时,到当前点最远的区间,
则 f[i]=min(f[pos[j]-1]+j*j),
由于一个区间内的颜色不应超过 sqrt( n ),
所以转移的复杂度为 O( sqrt( n ) ) ,
考虑对 pos 的维护( 刚开始想歪了- =,谢谢lazycal大神指导)
当加尽一个颜色,显然只有从上一个当前这个颜色的点到它之间的颜色数会发生改变,
设数组last[i]表示 i 颜色的上一个位置,如果pos落在这之间则 pos[j]=pos[j-1]
注意处理 j 为当前最多颜色的情况。
维护复杂度 O( sqrt( n ) );
总复杂度: O( n sqrt( n ) )
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<iostream>
#define INF 999999999999
#define LL long long
#define N 40004
#define Min(x,y) if(x>y) x=y
using namespace std ;
int n,m,pos[N],last[N],f[N],col;
int main(){
scanf("%d%d",&n,&m);
m=min(int(sqrt(n)),m);
memset(pos,-,sizeof pos);
for(int i=;i<=n;i++){
scanf("%d",&col);
if(i-&&last[col]==i-){
f[i]=f[i-];
last[col]=i;
continue;
}
for(int j=m;j-;j--)
if((pos[j]==-&&pos[j-]>last[col])||pos[j]>last[col])
pos[j]=pos[j-];
pos[]=i;
last[col]=i;
f[i]=f[i-]+;
for(int j=m; j ;j--)
if(pos[j]!=-)
Min(f[i],f[pos[j]-]+j*j);
}
printf("%d",f[n]);
}
usaco 打扫食槽的更多相关文章
- bzoj usaco 金组水题题解(1)
UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT. ...
- USACO . Your Ride Is Here
Your Ride Is Here It is a well-known fact that behind every good comet is a UFO. These UFOs often co ...
- 【USACO 3.1】Stamps (完全背包)
题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...
- USACO翻译:USACO 2013 NOV Silver三题
USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...
- USACO翻译:USACO 2013 DEC Silver三题
USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...
- USACO翻译:USACO 2014 DEC Silver三题
USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 马拉松 奶牛慢跑 英文题目名称 piggyback marathon cowjog 可执行文件名 piggyback ma ...
- USACO翻译:USACO 2012 FEB Silver三题
USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...
- USACO翻译:USACO 2012 JAN三题(3)
USACO 2012JAN(题目三) 一.题目概览 中文题目名称 放牧 登山 奶牛排队 英文题目名称 grazing climb lineup 可执行文件名 grazing climb lineup ...
- USACO翻译:USACO 2012 JAN三题(2)
USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...
随机推荐
- ORACLE数据库闪回日志写满
网站页面无法显示完整.检查web服务是正常的,所以可能是ORACLE数据库出了问题. 首先检查闪回日志写满 然后检查归档日志文件写满的缘故了.使用以下几个命令可以看出当前归档日志文件的使用情况: se ...
- 深入了解float
1.float的历史 初衷是为了图片的文字环绕,将img设置float 2.破坏性与包裹性 a.父元素没有设置高度,内部元素浮动后,服务元素的高度被破坏了,可以将其父元素设置overflow:h ...
- [C#]async/Await 使用小计
如果指定使用 异步 或 异步 修饰符,方法是异步方法,可以实现以下两个函数. • 清单异步方法可以使用 Await 或指定的 等待 悬挂点. 等待运算符通知编译器异步方法不能继续点的过去,直到等待 ...
- GDI画验证码
Random r = new Random(); string str = ""; for (int i = 0; i < 5; i++) { int a= r.Next(0 ...
- PHP程序缓存之文件缓存处理方式
PHP程序缓存之文件缓存处理方式在开发程序过程中,缓存的设置大大提升程序效率,减小数据库负载.基本配置缓存和常规配置缓存 基本配置缓存在项目开发中类似这样子的格式: 文件:config.php $CF ...
- 使用WMI监控进程启动与结束
需要添加引用System.Management 代码: static void Main(string[] args) { //创建WQL事件查询,监视进程开启 var qCreate = new W ...
- poj 1144 Network
Network 题意:输入n(n < 100)个点,不一定是连通图,问有多少个割点? 割点:删除某个点之后,图的联通分量增加. 思路:dfs利用时间戳dfs_clock的特性,点u的low函数l ...
- LinkedHashMap和HashMap的比较使用(转载)
LinkedHashMap和HashMap的比较使用 ? import java.util.HashMap; import java.util.Iterator; import java.util.L ...
- cmd下运行java文件时,找不到或无法加载主类的解决方法
最近再看java,却被一个看似很基础的hellorworld头疼了十几分钟,百度了一下,若你在cmd下编辑及运行.java文件时报错,解决方案如下,如图所示:
- but has failed to stop it. This is very likely to create a memory leak(c3p0在Spring管理中,连接未关闭导致的内存溢出)
以下是错误日志信息: 严重: The web application [/news] registered the JDBC driver [com.mysql.jdbc.Driver] but fa ...