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股 且一次 ...
随机推荐
- hammerjs wabapp h5 触屏手势一网打尽
hammerjs官网 http://hammerjs.github.io/ 学习文章1 http://www.cnblogs.com/vajoy/p/4011723.html 学习文章2 htt ...
- (3.3)mysql基础深入——mysql启动深入分析
基础:(2.1)学习笔记之mysql基本操作(启动与关闭) 0.mysql启动的 3种方式 (1)mysql.server (2)mysqld_safe (3)mysqld 1.启动分析 [1.1]概 ...
- 怎样在 Ubuntu 上使用 ZFS 文件系统 | Linux 中国
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79329762 http://mmbiz ...
- 梯度下降算法(Gradient Descent)
近期在搞论文,须要用梯度下降算法求解,所以又一次整理分享在这里. 主要包含梯度介绍.公式求导.学习速率选择.代码实现. 梯度下降的性质: 1.求得的解和选取的初始点有关 2.能够保证找到局部最优解,由 ...
- .NET数据挖掘与机器学习开源框架
1. 数据挖掘与机器学习开源框架 1.1 框架概述 1.1.1 AForge.NET AForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经 ...
- 一起做RGB-D SLAM (2)
第二讲 从图像到点云 本讲中,我们将带领读者,编写一个将图像转换为点云的程序.该程序是后期处理地图的基础.最简单的点云地图即是把不同位置的点云进行拼接得到的. 当我们使用RGB-D相机时,会从相机里读 ...
- (转)Springboot 中filter 注入对象
问题:我建立一个全局拦截器,当然,这是测试的时候建立的,我把它命名为LogFilter,它继承了Filter,web应用启动的顺序是:listener->filter->servlet,而 ...
- (Power Strings)sdutoj2475
#include <stdio.h>#include <string.h>#include <stdlib.h>char a[1000001];int next[1 ...
- HTTP请求返回状态码详解
当用户试图通过 HTTP 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码.状态代码可以指明具体请求是否已成功,还可以揭示请求失 ...
- testng使用DataProvider+Excel实现DDT
DDT,即数据驱动测试 Data Driver Test,我曾经记录了一篇关于python的DDT框架(Excel+DDT数据驱动实例),那么java中的DDT是怎么样的呢?在java中,可以用tes ...