hdu6444 Neko's Loop
要想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的更多相关文章
- 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 ...
- 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 ...
- hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解
题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手 ...
- hdu 6444 Neko's loop 单调队列优化DP
Neko's loop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Neko's loop HDU-6444(网络赛1007)
题意就是给出n个数,在n个数上每次跳k个数,最多可以跳m次,你可以选择跳任意次,也可以都不跳,问你为了达到目标了快乐值至少在开始的需要多少快乐值. 题目可以转换成找出循环节,然后再循环节上疯狂试探我可 ...
- 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. ...
- HDU - 6444 Neko's loop(循环节+最大子段和)
http://acm.hdu.edu.cn/showproblem.php?pid=6444 题意 一个有n个数的环,每次循环走k步,走到每个点都有具体的权值,问在任意点出发最多走m步的情况下,一开始 ...
- 【hdu 6444】Neko's loop
[链接] 我是链接,点我呀:) [题意] 给你一个序列. 你可以选择起点i. 然后每次往右跳k次. 得到下一个值a[i+k];. 问你跳m次能得到的最大值ma是多少. 如果>=s输出0 否则输出 ...
- HDU 6444 Neko's loop ( 2018 CCPC 网络赛 && 裴蜀定理 && 线段树 )
题目链接 题意 : 给出一个 n 个元素的环.可以任意选择起点.选完起点后.可以行走 m 步.每次前进 k 个单位.所走到的点将产生正或负贡献.问你一开始得准备多少才能使得初始资金加上在环上获取最大利 ...
随机推荐
- Win7系统的任务管理器显示不全
Win7系统的任务管理器显示不全:如下图所示 首先要说明的是:出现这种现象是正常的,因为这种样式是任务管理器的精简模式. 还原方法:双击任务管理器四周的空白边框,即可恢复初始模式. 效果图如下:
- Android Edittext聚焦时输入法挡住了EditText输入框的两种解决方案
方案一.把整个布局文件用ScrollView套住.这样当你聚焦时虽然输入法也能够挡住一些输入框,但是你可以通过手动滑动看被挡住的内容. 方案二.在Activity中设置android:windowSo ...
- 从CMDB动态获取服务器列表,按照Ansible的约定
目标效果: [root@ansible ~]# python query.py --list{ "test": [ "10.1.2.1", "10.1 ...
- MVC 如何在action中获取当前网站的根路径
如果基于MVC搭建的网站在IIS发布的是一个单独的端口,那么可以直接通过后面语句获得跟路径:Request.Url.GetLeftPart(UriPartial.Authority).ToString ...
- 20155232《网络对抗》 Exp1 PC平台逆向破解(5)M
20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...
- 20155310 《网络攻防》Exp4 恶意代码分析
20155310 <网络攻防>Exp4 恶意代码分析 基础问题 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些, ...
- C标准库string.h中几个常用函数的使用详解
strlen 计算字符串长度 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符. 函数实现: int Strlen(cons ...
- 《Effective Java》学习笔记 —— 通用程序设计
本章主要讨论局部变量.控制结构.类库.反射.本地方法的用法及代码优化和命名惯例. 第45条 将局部变量的作用域最小化 * 在第一次使用的它的地方声明局部变量(就近原则). * 几乎每个局部变量的声明都 ...
- HTML-JS 循环 函数 递归
[循环结构的执行步骤] 1.声明循环变量 2.判断循环条件 3.执行循环体操作 4.更新循环变量 然后,循环执行2-4,直到条件不成立时,跳出循环. while循环()中的表达式,运算结果可以是各种类 ...
- java十年,需要学会的Java开发体系
阿里十年,只剩下这套Java开发体系了,链接:https://www.jianshu.com/p/ca6c4a73aac9