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)求出每个循环节, 然后对每个循环节 求上面的结果

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <vector>
  6.  
  7. typedef long long ll;
  8. using namespace std;
  9.  
  10. const int N = 1e4+;
  11.  
  12. int n,m,k,cnt ;
  13. ll s, MAX, v[N];
  14. bool vis[N]; vector<ll> g[N];
  15. ll que[N<<],mx[N<<],sta[N<<];
  16.  
  17. ll solve(const vector<ll>&vv, int count) {
  18. int sz= vv.size();
  19. for(int i=;i<sz;i++)
  20. que[i] = que[i+sz] = vv[i];
  21. sz = sz<<;
  22. int st=,ed=;
  23. ll res=;
  24. for(int i=;i<sz;i++) {
  25. if(i==)
  26. mx[i] = que[i];
  27. else
  28. mx[i] = mx[i-]+que[i];
  29.  
  30. if(i < count)
  31. res = max(res, mx[i]);
  32.  
  33. while (st < ed && sta[st]+count < i)
  34. st++;
  35. if(st < ed)
  36. res = max(res, mx[i] - mx[sta[st]]);
  37. while (st < ed && mx[i] <= mx[sta[ed-]])
  38. ed--;
  39. sta[ed++]=i;
  40. }
  41. return res;
  42. }
  43.  
  44. ll getRes(const vector<ll>& vv,int step,ll top) {
  45. ll mod = step % vv.size(); ll kk = step/ vv.size();
  46. ll sum = ;
  47. for(int i=; i<vv.size();i++)
  48. sum += vv[i];
  49. ll mx1 = solve(vv, mod);
  50. ll mx2 = solve(vv, vv.size());
  51. mx1 += max(0LL, sum)*kk;
  52. mx2 += max(0LL, sum)*((kk>)?kk-:);
  53. return max(mx1,mx2);
  54. }
  55.  
  56. int main ()
  57. {
  58. //freopen("in.txt","r",stdin);
  59. int T; scanf("%d",&T);
  60. for(int cas=; cas<=T; cas++) {
  61. memset(vis,,sizeof(vis));
  62. scanf("%d %lld %d %d", &n, &s, &m, &k);
  63. for(int i=;i<n;i++)
  64. scanf("%lld", &v[i]);
  65. cnt=; MAX=;
  66. for(int i=; i<n; i++) {
  67. g[cnt].clear();
  68. if(!vis[i]) {
  69. vis[i]=;
  70. g[cnt].push_back(v[i]);
  71. for(int j=(i+k)%n; j!=i && !vis[j]; j=(j+k)%n) {
  72. g[cnt].push_back(v[j]);
  73. vis[j]=;
  74. }
  75. //for(int j=0;j<g[cnt].size();j++)
  76. //cout << g[cnt][j]<<" ";
  77. //cout <<endl;
  78. MAX = max(MAX, getRes(g[cnt], m, s));
  79. cnt++;
  80. }
  81. }
  82. if(MAX >= s) MAX=;
  83. else MAX = s-MAX;
  84. printf("Case #%d: %lld\n", cas, MAX);
  85. }
  86. return ;
  87. }

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. 打造自己的 JavaScript 武器库

    原文 https://segmentfault.com/a/1190000011966867 github:https://github.com/proYang/outils 前言 作为战斗在业务一线 ...

  2. python 经验:把全局变量放在一个类中

    注:红色是我增加的注释 add by zhj:其实python中的import, from-import语句是创建新的同名变量指向引入的模块和模块属性,这也就解释了下面的情况. 我们应尽量不用全局变量 ...

  3. Service 的 onStartCommand(Intent, int, int) 返回值

    (1)START_NOT_STICKY If the system kills the service after onStartCommand() returns, do not recreate ...

  4. [py]django第三方分页器django-pure-pagination实战

    第三方分页模块: django-pure-pagination 是基于django的pagination做的一款更好用的分页器 参考 配置django-pure-pagination模块 安装 pip ...

  5. (转)使用git stash解决git pull时的冲突

    在使用git pull代码时,经常会碰到有冲突的情况,提示如下信息: error: Your local changes to 'c/environ.c' would be overwritten b ...

  6. STA分析(五) parastics

    互联线的寄生参数 一般一个cell或者block的连接pin就叫做一个net.在物理实现的时候,一条net可能会穿过几层metal,因为每个metal层的电阻,电容值都不一样.所以,在分析 net的寄 ...

  7. Python3 socketserver模块

    socketserver(在Python2.*中的是SocketServer模块)是标准库中一个高级别的模块.用于简化网络客户与服务器的实现(在前面使用socket的过程中,我们先设置了socket的 ...

  8. 33. Search in Rotated Sorted Array(二分查找)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  9. IntelliJ IDEA 编译Java程序出现 'Error:java: 无效的源发行版: 9' 解决方法

    最新安装的IntelliJ IDEA 2018.1编译器,创建Java Project,并选择之前安装好的Eclipse配置的JDK,如图所示: 在工程中添加 Main.class, main函数中写 ...

  10. BP神经网络的Java实现(转载)

    神经网络的计算过程 神经网络结构如下图所示,最左边的是输入层,最右边的是输出层,中间是多个隐含层,隐含层和输出层的每个神经节点,都是由上一层节点乘以其权重累加得到,标上“+1”的圆圈为截距项b,对输入 ...