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股 且一次 ...
随机推荐
- CH0102 64位整数乘法 数论
正解:数论/一个神仙想法 解题报告: 先放传送门qwq 两种方法,都还挺妙的就都写了qwq 第一种是快速幂 把b用二进制表示成,ck*2k+ck-1*2k-1+...+c0*20 然后就可以表示成,a ...
- linux下ssh远程登录/scp远程复制文件/rsync远程同步命令的自动登录
最近需要写一个脚本备份各个服务器上的程序到一个指定服务器上,本来以为查查rsync命令的使用321就能搞定,结果rsync命令要支持自动登 录还是要配置服务和参数,又不确定网上说的配置的行不行,因为都 ...
- python中操作mysql
import pymysql # 连接数据库 connect = pymysql.Connect( host='localhost', port=3306, user='root', passwd=' ...
- 用SCSS需要小心IE对css的几个限制
IE对CSS的限制主要有两个: 一个页面中引用的CSS只读前32个 一个CSS文件中只读前4095个选择器 关于这个问题的文章有很多,我就不细讲了. 我想讲的是在用SCSS写CSS的时候非常容易超过这 ...
- ul li剧中对齐
html: <div class="footernav"> <ul> <li>首页</li> <li>文章</li ...
- java8,方法引用
1:方法引用,https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html 当我们使用lambda表达式去创建一个 ...
- Google面试题[一]
谷歌是不少IT人都想去的企业,那么在进入公司前,少不了面试笔试的测试.那么这里我们就总结了如下谷歌笔试题,并提供了一些参考答案.希望对您有用. 谷歌笔试题:判断一个自然数是否是某个数的平方.当然不能使 ...
- dialog提交表单
<div id="dialog" title="添加客户"> <!--表单提交--> <form id="dialogF ...
- 为什么size_t重要?
参见 http://en.cppreference.com/w/cpp/types/size_t size_t其实与uintptr_t一个道理.就是一个东西.指针其实就是寻址,与地址总线位数一致,编译 ...
- js实现轮播图2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...