要想A一道题,你需要正版ide,正版草稿纸,正版键盘,正版双手,但最重要的是正版大脑.(改编自wxf在微积分群的吐槽)

分析一下题意,选的所有数的下标模gcd(n,k)都是同余的,而且是在所有同余的下标上循环.

对不同余数的下标分别处理,分别转换为在一串长度为N=n/gcd(n,k)的数上一格一格往右边走,走到头循环回来时,走m步最多能得到多大的和.

考虑对所有数字求个和sum.如果sum<0,那么最优方案走的步数不会超过N(否则少走连续N步一定使答案变优),只需要单调队列求带长度限制的最大区间和.

如果sum>0,那么只要m>N,则最优方案走的步数不会少于m-N步(否则多走N步使得答案变大)

sum>0的时候解题的想法还是要转化为求一个最大区间和.以走m/N*N步的方案为基准(这个方案不管从哪里开始走都得到相同的答案),考虑多走或者少走几步,但是总步数在[m-N,m]变化.多走几步的情况就是找一个带长度限制的最大区间和,少走几步的情况就是找一个带长度限制的最小区间和把它从答案里去掉.都是单调队列就能搞定.借助函数指针可以把最大区间和以及最小区间和写成一个函数.

#include<cstdio>
typedef long long ll;
const int maxn=10005;
ll max(ll a,ll b){
return a>b?a:b;
}
ll min(ll a,ll b){
return a<b?a:b;
}
int a[maxn],b[maxn];
ll pre[maxn<<1];
int gcd(int a,int b){
return (b==0)?a:gcd(b,a%b);
}
int q[maxn<<1];
int head=0,tail=0;
void push(int x,ll cmp(ll,ll)){
while(head!=tail&&(cmp(pre[x],pre[q[tail-1]])==pre[q[tail-1]]))tail--;
q[tail++]=x;
}
void pop(int lim){
while(head!=tail&&q[head]<=lim)head++;
}
ll get_extreme(int N,int M,ll cmp(ll,ll)){
ll ans=0;head=tail=0;
push(0,cmp);
for(int i=1;i<=N;++i){
ans=cmp(ans,pre[i]-pre[q[head]]);
push(i,cmp);
pop(i-M);
}
return ans;
}
ll calc(){
int n;ll s;int m,k;
scanf("%d%lld%d%d",&n,&s,&m,&k);
for(int i=0;i<n;++i)scanf("%d",a+i);
int period=gcd(n,k);
int N=n/period;
ll ans=0;
for(int i=0;i<period;++i){
for(int j=i,p=0;p<N;j=(j+k)%n){
b[++p]=a[j];
}
pre[0]=0;
for(int j=1;j<=N;++j)pre[j]=pre[j-1]+b[j];
for(int j=1;j<=N;++j)pre[j+N]=pre[j]+pre[N];
if(pre[N]<=0||m<=N){
ans=max(ans,get_extreme(2*N,min(N,m),max));
}else{
int mm=m/N*N;
int hidlt=m-mm;
int lodlt=N-hidlt;
ans=max(ans,m/N*1ll*pre[N]+get_extreme(2*N,hidlt,max));
ans=max(ans,m/N*1ll*pre[N]-get_extreme(2*N,lodlt,min));
}
}
return max(0,s-ans);
}
int main(){
int T;scanf("%d",&T);
for(int i=1;i<=T;++i){
printf("Case #%d: %lld\n",i,calc());
}
return 0;
}

hdu6444 Neko's Loop的更多相关文章

  1. 2018 CCPC网络赛 hdu6444 Neko's loop

    题目描述: 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 ...

  2. hdu6444 2018中国大学生程序设计竞赛 - 网络选拔赛 1007 Neko's loop

    Neko's loop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total S ...

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

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

  4. hdu 6444 Neko's loop 单调队列优化DP

    Neko's loop Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. Neko's loop HDU-6444(网络赛1007)

    题意就是给出n个数,在n个数上每次跳k个数,最多可以跳m次,你可以选择跳任意次,也可以都不跳,问你为了达到目标了快乐值至少在开始的需要多少快乐值. 题目可以转换成找出循环节,然后再循环节上疯狂试探我可 ...

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

  7. HDU - 6444 Neko's loop(循环节+最大子段和)

    http://acm.hdu.edu.cn/showproblem.php?pid=6444 题意 一个有n个数的环,每次循环走k步,走到每个点都有具体的权值,问在任意点出发最多走m步的情况下,一开始 ...

  8. 【hdu 6444】Neko's loop

    [链接] 我是链接,点我呀:) [题意] 给你一个序列. 你可以选择起点i. 然后每次往右跳k次. 得到下一个值a[i+k];. 问你跳m次能得到的最大值ma是多少. 如果>=s输出0 否则输出 ...

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

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

随机推荐

  1. jqgrid 设置行编辑为本地端编辑状态

    有时,我们需要在jqgrid表格中做编辑操作,而jqgrid默认是启动了行保存连接到服务器更新.此时,如果没有指定editurl的有效url值时会报错 有时,我们需要将编辑完的表格数据一次性提交保存( ...

  2. 运放参数的详细解释和分析-part3,输入失调电压Vos及温漂

    运放参数的详细解释和分析-part3,输入失调电压Vos及温漂 在运放的应用中,不可避免的会碰到运放的输入失调电压Vos问题,尤其对直流信号进行放大时,由于输入失调电压Vos的存在,放大电路的输出端总 ...

  3. Django进阶(2)

    1.在D盘创建mysite工程项目:  django-admin startproject mysite manage.py ----- Django项目里面的工具,通过它可以调用django she ...

  4. scala-数组操作

    package com.bigdata import scala.collection.mutable.ArrayBuffer object ArrayO { def main(args: Array ...

  5. Java基础—基础语法与常用命令

    一.基础语法 1.case不加break会有穿透效果 根据阿里规范,严禁省略default语句,即使它一句话也没有 2.for循环执行顺序: for(初始化1;条件2;迭代运算3){ 循环体4: } ...

  6. 20155202《网络对抗》Exp8 Web基础

    20155202<网络对抗>Exp8 Web基础 基础问题回答 什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选框等等)输入信息 ...

  7. Data Consistency Primer

    云应用通常来说,使用的数据很多都是分散的,来自不同的数据仓库.在这种环境下,管理和保持数据一致性是很复杂的,无论是在并发跟可用性上都可能出问题.开发者有的时候就需要为了强一致性而牺牲可用性了.这也就意 ...

  8. Spring Boot(十二):Spring Boot 如何测试打包部署

    有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...

  9. SQL调优日志--内存问题排查入门篇

    概述 很多系统的性能问题,是由内存导致的.内存不够会导致页面频繁换入换出,IO队列高,进而影响数据库整体性能. 排查 内存对数据库性能非常重要.那么我当出现问题的时候,我们怎么排查性能问题呢? 存在问 ...

  10. Linux Socket 编程简介

    在 TCP/IP 协议中,"IP地址 + TCP或UDP端口号" 可以唯一标识网络通讯中的一个进程,"IP地址+端口号" 就称为 socket.本文以一个简单的 ...