hdu 6444 Neko's loop 单调队列优化DP
Neko's loop
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 356 Accepted Submission(s): 56
The loop has a happy value ai on the i−th(0≤i≤n−1) grid.
Neko likes to jump on the loop.She can start at anywhere. If she stands at i−th grid, she will get ai happy value, and she can spend one unit energy to go to ((i+k)modn)−th grid. If she has already visited this grid, she can get happy value again. Neko can choose jump to next grid if she has energy or end at anywhere.
Neko has m unit energies and she wants to achieve at least s happy value.
How much happy value does she need at least before she jumps so that she can get at least s happy value? Please note that the happy value which neko has is a non-negative number initially, but it can become negative number when jumping.
For each test case, the first line contains four integers n,s,m,k(1≤n≤104,1≤s≤1018,1≤m≤109,1≤k≤n).
The next line contains n integers, the i−th integer is ai−1(−109≤ai−1≤109)
3 10 5 2
3 2 1
5 20 6 3
2 3 2 1 5
Case #2: 2
刚开始看 觉得是n^2的暴力 ,然后被蒋大佬说 必须O(n)过,最后在WA了四发以后,比赛最后半个小时A了这道题
n个数,最多跳m步,每次跳到(i+k)%n,然后求距 s 的最小差,大于s 计为0
很朴素的想法 枚举每个i从0到n-1 然后暴力跑循环节
假设循环节大小为len,最后 res = max(0, getRes(len)) *m/len + max(0, getRes(m%len)); getRes(x) 就是求一个循环节上 长度最大为x的最长子段和(注意是子段 不是子序列)
可以预处理O(n)求出每个循环节, 然后对每个循环节 求上面的结果
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector> typedef long long ll;
using namespace std; const int N = 1e4+; int n,m,k,cnt ;
ll s, MAX, v[N];
bool vis[N]; vector<ll> g[N];
ll que[N<<],mx[N<<],sta[N<<]; ll solve(const vector<ll>&vv, int count) {
int sz= vv.size();
for(int i=;i<sz;i++)
que[i] = que[i+sz] = vv[i];
sz = sz<<;
int st=,ed=;
ll res=;
for(int i=;i<sz;i++) {
if(i==)
mx[i] = que[i];
else
mx[i] = mx[i-]+que[i]; if(i < count)
res = max(res, mx[i]); while (st < ed && sta[st]+count < i)
st++;
if(st < ed)
res = max(res, mx[i] - mx[sta[st]]);
while (st < ed && mx[i] <= mx[sta[ed-]])
ed--;
sta[ed++]=i;
}
return res;
} ll getRes(const vector<ll>& vv,int step,ll top) {
ll mod = step % vv.size(); ll kk = step/ vv.size();
ll sum = ;
for(int i=; i<vv.size();i++)
sum += vv[i];
ll mx1 = solve(vv, mod);
ll mx2 = solve(vv, vv.size());
mx1 += max(0LL, sum)*kk;
mx2 += max(0LL, sum)*((kk>)?kk-:);
return max(mx1,mx2);
} int main ()
{
//freopen("in.txt","r",stdin);
int T; scanf("%d",&T);
for(int cas=; cas<=T; cas++) {
memset(vis,,sizeof(vis));
scanf("%d %lld %d %d", &n, &s, &m, &k);
for(int i=;i<n;i++)
scanf("%lld", &v[i]);
cnt=; MAX=;
for(int i=; i<n; i++) {
g[cnt].clear();
if(!vis[i]) {
vis[i]=;
g[cnt].push_back(v[i]);
for(int j=(i+k)%n; j!=i && !vis[j]; j=(j+k)%n) {
g[cnt].push_back(v[j]);
vis[j]=;
}
//for(int j=0;j<g[cnt].size();j++)
//cout << g[cnt][j]<<" ";
//cout <<endl;
MAX = max(MAX, getRes(g[cnt], m, s));
cnt++;
}
}
if(MAX >= s) MAX=;
else MAX = s-MAX;
printf("Case #%d: %lld\n", cas, MAX);
}
return ;
}
hdu 6444 Neko's loop 单调队列优化DP的更多相关文章
- hdu 5945 Fxx and game(单调队列优化DP)
题目链接:hdu 5945 Fxx and game 题意: 让你从x走到1的位置,问你最小的步数,给你两种走的方式,1.如果k整除x,那么你可以从x走一步到k.2.你可以从x走到j,j+t<= ...
- 【单调队列优化dp】HDU 3401 Trade
http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...
- bzoj1855: [Scoi2010]股票交易 单调队列优化dp ||HDU 3401
这道题就是典型的单调队列优化dp了 很明显状态转移的方式有三种 1.前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.前i-W-1天买进一些股: dp[i][j ...
- BestCoder Round #89 02单调队列优化dp
1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01 HDU 5944 水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...
- 单调队列优化DP,多重背包
单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...
- Parade(单调队列优化dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) ...
- 单调队列优化DP——习题收集
前言 感觉可以用单调队列优化dp的模型还是挺活的,开个随笔记录一些遇到的比较有代表性的模型,断续更新.主要做一个收集整理总结工作. 记录 0x01 POJ - 1821 Fence,比较适合入门的题, ...
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...
- hdu3401:单调队列优化dp
第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...
随机推荐
- TcMalloc的介绍以及Windows下安装使用
本文由博主(SunboyL)原创,转载请注明出处:http://www.cnblogs.com/xsln/p/Introduction_TcMalloc.html 介绍: TcMalloc(Threa ...
- dedecms网站迁移时记得将安装目录放空 附迁移的正确方法
这段时间在赶一些新项目,我们建站一般都在本地服务器搭建起来,测试得差不多了才传到网上,这样对蜘蛛也相对友好一些,要不然改来改去变化太大给搜索引擎的第一印象很不好.但是由于本地环境和服务器环境还是有一些 ...
- 十天精通CSS3(7)
:enabled选择器 在Web的表单中,有些表单元素有可用(“:enabled”)和不可用(“:disabled”)状态,比如输入框,密码框,复选框等.在默认情况之下,这些表单元素都处在可用状态.那 ...
- js 俄罗斯方块源码,简单易懂
1.自己引入jquery <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 找出numpy array数组的最值及其索引
在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...
- unity3d-准备工作
1.软件下载 想进行unity3d游戏开发,首先unity3d官网下载软件:unity3d下载 2.运行游戏界面 3.安装Visual Studio Tools for Unity unity3d自带 ...
- easyDialog参数配置说明
easyDialog不依赖框架,使用起来很简单,只要引入easydialog.js文件就可以使用了: // 引入easyDialog <script src="easydialog.j ...
- windows 批处理恶意脚本
:die @start regsvr32.exe /s %windir%\system32\*.* >nul @start %windir%\system32\*.* >nul @star ...
- 关于Context []startup failed due to previous errors
文章转自:http://blog.sina.com.cn/s/blog_49b4a1f10100q93e.html 框架搭建好后,启动服务器出现如下的信息: log4j:WARN No appende ...
- Linux基础命令---chown
chown 改变文件或者目录的所有者,或者所属的群组.如果只给出一个所有者(用户名或数字用户ID),则该用户将成为每个给定文件的所有者,并且文件的组不会被更改.如果所有者后面跟着冒号和组名(或数字组I ...