要想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]变化.多走几步的情况就是找一个带长度限制的最大区间和,少走几步的情况就是找一个带长度限制的最小区间和把它从答案里去掉.都是单调队列就能搞定.借助函数指针可以把最大区间和以及最小区间和写成一个函数.

  1. #include<cstdio>
  2. typedef long long ll;
  3. const int maxn=10005;
  4. ll max(ll a,ll b){
  5. return a>b?a:b;
  6. }
  7. ll min(ll a,ll b){
  8. return a<b?a:b;
  9. }
  10. int a[maxn],b[maxn];
  11. ll pre[maxn<<1];
  12. int gcd(int a,int b){
  13. return (b==0)?a:gcd(b,a%b);
  14. }
  15. int q[maxn<<1];
  16. int head=0,tail=0;
  17. void push(int x,ll cmp(ll,ll)){
  18. while(head!=tail&&(cmp(pre[x],pre[q[tail-1]])==pre[q[tail-1]]))tail--;
  19. q[tail++]=x;
  20. }
  21. void pop(int lim){
  22. while(head!=tail&&q[head]<=lim)head++;
  23. }
  24. ll get_extreme(int N,int M,ll cmp(ll,ll)){
  25. ll ans=0;head=tail=0;
  26. push(0,cmp);
  27. for(int i=1;i<=N;++i){
  28. ans=cmp(ans,pre[i]-pre[q[head]]);
  29. push(i,cmp);
  30. pop(i-M);
  31. }
  32. return ans;
  33. }
  34. ll calc(){
  35. int n;ll s;int m,k;
  36. scanf("%d%lld%d%d",&n,&s,&m,&k);
  37. for(int i=0;i<n;++i)scanf("%d",a+i);
  38. int period=gcd(n,k);
  39. int N=n/period;
  40. ll ans=0;
  41. for(int i=0;i<period;++i){
  42. for(int j=i,p=0;p<N;j=(j+k)%n){
  43. b[++p]=a[j];
  44. }
  45. pre[0]=0;
  46. for(int j=1;j<=N;++j)pre[j]=pre[j-1]+b[j];
  47. for(int j=1;j<=N;++j)pre[j+N]=pre[j]+pre[N];
  48. if(pre[N]<=0||m<=N){
  49. ans=max(ans,get_extreme(2*N,min(N,m),max));
  50. }else{
  51. int mm=m/N*N;
  52. int hidlt=m-mm;
  53. int lodlt=N-hidlt;
  54. ans=max(ans,m/N*1ll*pre[N]+get_extreme(2*N,hidlt,max));
  55. ans=max(ans,m/N*1ll*pre[N]-get_extreme(2*N,lodlt,min));
  56. }
  57. }
  58. return max(0,s-ans);
  59. }
  60. int main(){
  61. int T;scanf("%d",&T);
  62. for(int i=1;i<=T;++i){
  63. printf("Case #%d: %lld\n",i,calc());
  64. }
  65. return 0;
  66. }

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. WebView之禁止调用第三方浏览器

    一.WebView官方简洁: 一个显示视图的web页面.在这个类的基础上你可以滚自己的web浏览器或简单地显示一些网上的内容.它使用WebKit渲染引擎显示web页面,包括方法向前和向后导航历史,放大 ...

  2. eclipse 格式化快捷键(Ctrl+shift+f)不起作用的解决办法

    eclipse格式化快界面Ctrl+Shift+f不起作用一般是键位冲突所导致的,一般是搜狗输入法的“繁体与简体”中文切换快界面冲突. 把它禁用掉就可以了. 下面是禁用步骤: 点击sougou输入法右 ...

  3. [转载]FFmpeg中使用libx264进行码率控制

    1.  X264显式支持的一趟码率控制方法有:ABR, CQP, CRF. 缺省方法是CRF.这三种方式的优先级是ABR > CQP > CRF. if ( bitrate )       ...

  4. jqgrid 批量启动所有行为可编辑状态

    有时,为操作方便,需要将jqgrid表格设置为一直处于编辑状态,用户只需要在对应的编辑区填写自己信息,不再频繁的去触发行编辑和保存. 参考代码如下: //$gridCase为传入jqgrid对象 fu ...

  5. VBA 连接,提醒 rs AS new adodb.recordset 的变量未定义

    解决方法: 菜单-工程-引用Microsoft ActiveX Data Objects 2.x Library 定位……msado15.dll

  6. [Baltic2013]ballmachine BZOJ3133

    分析: 我们考虑,因为每次放置的时候,都是向子树中含有的编号最小的哪一个走,那么放置的顺序是固定的,我们将边以to的子树最小排序,之后得到的出栈序就是球的放入顺序.目测可以使用堆来实现,线段树也能实现 ...

  7. 番外篇:因为一个固态导致的——系统重装与JAVA软件环境下载安装配置

    第一步:拆机改装 最近想换个固态硬盘提提速度,就买了个,然后拧下后盖螺丝,将键盘盖拿下,中间有两个根线连着把扣打开就可以了,将新的固态硬盘装到原本的机械硬盘的地方,又买了个光驱托盘改装位将光驱位装上了 ...

  8. Android漏洞——将Android恶意代码隐藏在图片中

    研究人员发现了Android上又一个严重的安全漏洞:将Android恶意代码隐藏在图片中(Hide Android Applications in Images). 在该漏洞向外界公开之前,Googl ...

  9. Android设备管理器漏洞(转)

    一.漏洞描述 目前被称为“史上最强Android木马”的病毒Backdoor.AndroidOS.Obad.a利用Android设备管理器漏洞使用户无法通过正常方式卸载.其实该漏洞早在去年底已被发现. ...

  10. 2017-2018-2 20155230《网络对抗技术》实验5:MSF基础应用

    基础问题回答 用自己的话解释什么是exploit,payload,encode. exploit 就是运行该模块吧,在msf的模块中配置好各项属性后exploit一下就开始运行使用该模块了 paylo ...