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

Problem Description
Neko has a loop of size n.
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.
 
Input
The first line contains only one integer T(T≤50), which indicates the number of test cases. 
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)
 
Output
For each test case, output one line "Case #x: y", where x is the case number (starting from 1) and y is the answer.
 
Sample Input
2
3 10 5 2
3 2 1
5 20 6 3
2 3 2 1 5
 
Sample Output
Case #1: 0
Case #2: 2
 
Source
 
Recommend
chendu

刚开始看 觉得是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的更多相关文章

  1. hdu 5945 Fxx and game(单调队列优化DP)

    题目链接:hdu 5945 Fxx and game 题意: 让你从x走到1的位置,问你最小的步数,给你两种走的方式,1.如果k整除x,那么你可以从x走一步到k.2.你可以从x走到j,j+t<= ...

  2. 【单调队列优化dp】HDU 3401 Trade

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...

  3. 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 ...

  4. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  5. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  6. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  7. 单调队列优化DP——习题收集

    前言 感觉可以用单调队列优化dp的模型还是挺活的,开个随笔记录一些遇到的比较有代表性的模型,断续更新.主要做一个收集整理总结工作. 记录 0x01 POJ - 1821 Fence,比较适合入门的题, ...

  8. 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 ...

  9. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

随机推荐

  1. 程序猿职业生涯中的 Norris 常数

    我的朋友Clift Norris发现了一个基本常数.我称之为Norris常数,一个未经培训的程序猿在他或她遇到瓶颈之前能写出的平均代码量.Clift预计这个值是1500行. 超过这个数以后,代码会变得 ...

  2. 【Jason】Jason拓展

      Java-script是最基础语言(即前端脚本),而jquery是基于javascript封装出来的包,这些包里面含有能调用ajax的方法. ajax是一种异步交互,局部刷新的一种形式,是一种通讯 ...

  3. python中实现mysql连接池

    python中实现mysql连接池 import pymysql from DBUtils.PooledDB import PooledDB MYSQL_HOST = 'localhost' USER ...

  4. MyEclipse中jquery.js文件报missing semicolon的错误解决

    myeclipse的验证问题不影响jquery的应用,如果看着别扭,解决办法如下:选中你想去掉的js文件:右键选择 MyEclipse-->Exclude From Validation :然后 ...

  5. 字母统计-map

    题目描述 输入一行字符串,计算其中A-Z大写字母出现的次数 输入描述: 案例可能有多组,每个案例输入为一行字符串. 输出描述: 对每个案例按A-Z的顺序输出其中大写字母出现的次数. 示例1 输入 复制 ...

  6. [lr & ps] 色彩空间管理

    色彩空间 • 定义 色彩空间,Color Space,又称作色域.在色彩学中,人们建立了许多色彩模型,以一维.二维.三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间.我们经 ...

  7. http接口自动化测试框架实现

    一.测试需求描述 对服务后台一系列的http接口功能测试. 输入:根据接口描述构造不同的参数输入值 输出:XML文件 eg:http://xxx.com/xxx_product/test/conten ...

  8. e.printStackTrace() ; 是什么意思?

    catch(Exception e){e.printStackTrace() ;} 当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception ...

  9. php分层

    表示层         UI      主要表示WEB方式,也可以表示成WINFORM方式.如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务. 业务逻辑层  BLL     ...

  10. sql server 视图的操作

    -- 判断要创建的视图名是否存在if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[视图名]') and OBJ ...