题意就是给出n个数,在n个数上每次跳k个数,最多可以跳m次,你可以选择跳任意次,也可以都不跳,问你为了达到目标了快乐值至少在开始的需要多少快乐值。

题目可以转换成找出循环节,然后再循环节上疯狂试探我可以得到的最大快乐值,然后减一下。

刚开始想着找循环节,只找了一个,用栈存,然后发现可能会有多个循环节,需要考虑多个循环节的最大值,就转成vector存了。

对于每一个循环节,先找一次长度为m的序列,但是m可能比我的循环节来的大,所以我考虑循环起来。让 y 表示的我循环起来的圈数,y = m / len, x表示剩余的还没走的数,x = m % len,如果一圈可以获得的最大值,我就可以直接加上它,一开始我y圈的快乐值算成了y*sum,然后再去求最后x步的最大快乐值,然后相加,最后错了...炜神给了样例

1

5 1000 30 2

-1 -2 -3 -4 15

这时候我可以循环六圈,但是答案却不是这么算的,因为题目说我可以在任何时候停止,所以我可以在从15开始,到第五圈的15的时候提前结束,这样最后的负数我可以不取到,

所以这时候能直接计算出的最大值只有前y-1圈,然后特判能否循环起来,如果至少可以循环一圈的话,把 x = x + len,对于最后一圈进行特判,求出最后一圈加上剩余一点点步数可以得到的最大的快乐值。然后在相加。

这时候我最后一步的范围就是(0, 2*len),所以能走到的最大范围是(len-1,3*len),所以在求最大连续子串和的时候前缀和的数量应该开三倍空间。然后这题用deque会wa,可能是爆了吧...

#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x))
#define INOPEM freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout) typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 1e18+;
const int maxn = 1e5;
const int maxm = 1e9+;
const int mod = 1e9+;
using namespace std; ll n, m;
int T, tol;
ll s, k;
bool vis[maxn];
ll a[maxn];
ll b[maxn];
ll sum[maxn];
vector<ll> vec[maxn];
struct Node {
int first;
ll second;
};
Node q[maxn]; void init() {
tol = ;
memset(q, , sizeof q);
for(int i=; i<maxn; i++) vec[i].clear();
memset(vis, , sizeof vis);
} ll solve(int op, int n, ll m) {
ll ans = ;
memset(sum, , sizeof sum);
for(int i=; i<n; i++) sum[i] = i== ? vec[op][i] : sum[i-] + vec[op][i];
for(int i=n; i<*n; i++) sum[i] = sum[i-] + vec[op][i-n];
for(int i=*n; i<*n; i++) sum[i] = sum[i-] + vec[op][i-*n];
// for(int i=0; i<3*n; i++) printf("%lld%c", sum[i], i==3*n-1 ? '\n' : ' ');
int head = ;
int tail = ;
for(int i=; i<*n; i++) {
while(head < tail && q[tail-].second > sum[i-]) tail--;
while(head < tail && q[head].first + m < i) head++;
q[tail].first = i-;
q[tail].second = sum[i-];
tail++;
if(ans < sum[i] - q[head].second) {
ans = sum[i] - q[head].second;
}
}
return ans;
} int main() {
int cas = ;
scanf("%d", &T);
while(T--) {
init();
scanf("%lld%lld%lld%lld", &n, &s, &m, &k);
for(int i=; i<n; i++) scanf("%lld", &a[i]);
for(int i=; i<n; i++) {
if(!vis[i]) {
int pos = i;
while(!vis[pos]) {
vis[pos] = ;
vec[tol].push_back(a[pos]);
pos = (pos + k) % n;
}
tol++;
}
}
// for(int i=0; i<tol; i++) for(int j=0; j<vec[i].size(); j++) printf("%lld%c", vec[i][j], j==vec[i].size()-1 ? '\n' : ' ');
ll ans = -inf;
for(int i=; i<tol; i++) {
ll res = -inf;
int len = vec[i].size();
ll tmp = ;
for(int j=; j<len; j++) tmp += vec[i][j];
res = solve(i, len, m);
ans = max(ans, res);
if(tmp < ) continue;
ll x = m % len;
ll y = m / len;
tmp = max(y-, 0ll) * tmp;
if(y >= ) x += len;
res = max(res, solve(i, len, x) + tmp);
ans = max(ans, res);
}
ans = max(0ll, s-ans);
printf("Case #%d: %lld\n", cas++, ans);
}
return ;
}

Neko's loop HDU-6444(网络赛1007)的更多相关文章

  1. hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解

    题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手 ...

  2. HDU 6444 Neko's loop ( 2018 CCPC 网络赛 && 裴蜀定理 && 线段树 )

    题目链接 题意 : 给出一个 n 个元素的环.可以任意选择起点.选完起点后.可以行走 m 步.每次前进 k 个单位.所走到的点将产生正或负贡献.问你一开始得准备多少才能使得初始资金加上在环上获取最大利 ...

  3. hdu 5874 Friends and Enemies icpc大连站网络赛 1007 数学

    #include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> #i ...

  4. hdu5443(2015长春赛区网络赛1007)暴力

    题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...

  5. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  6. Hdu 4762 网络赛 高精度大数模板+概率

    注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放, ...

  7. 2018CCPC网络赛

    A - Buy and Resell HDU - 6438 The Power Cube is used as a stash of Exotic Power. There are nn cities ...

  8. HDU 4734 F(x) (2013成都网络赛,数位DP)

    F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. HDU 6444 Neko's loop(单调队列)

    Neko has a loop of size nn. The loop has a happy value aiai on the i−th(0≤i≤n−1)i−th(0≤i≤n−1) grid.  ...

随机推荐

  1. 简述HTTP协议

    引言 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议.HTTP 是基于 TCP/IP 协议通信协议 ...

  2. 三、Object 对象常用操作方法

    Object 构造方法 一.asign vs 扩展运算符 ... 1.共同点:都是浅拷贝 2.开发推荐 扩展运算符... let obj={ name: 'Tom', age: 18 }; let o ...

  3. Azure系列2.1.5 —— BlobOutputStream

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  4. Azure系列2.1.4 —— BlobInputStream

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  5. easyUI 数据表格datagrid的使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  6. eclipse中添加tomcat

    https://blog.csdn.net/Forlogen/article/details/54090335(copy) 为了Java Web的开发,下面我们来安装一下Tomcat服务器,并将其配置 ...

  7. python爬虫-1

    import resquests #import urllib.request from bs4 import BeautifulSoup from collections import Ordere ...

  8. js一元运算符

    否运算符(按位非):~    加1取反 console.log(~-); console.log(~-); console.log(~); //-1 void():计算表达式,但是不返回值(仅仅是不返 ...

  9. 使用proxychains 代理终端

    最近在国外的vps上搭建了一个ss服务器,在浏览器里面设置socks5代理上网很方便, 但是终端里面却只支持http方式的代理配置,网上有socks转http代理的方式,但是最近发现一个更为简单的方式 ...

  10. php重定向http请求

    302  临时重定向 301  永久重定向     (  302 和 301  的区别主要在于搜索引擎,搜索引擎一般不会抓取临时重定向的页面  ) 301 和302 适用于 普通的GET 请求: 如果 ...