【链接】 我是链接,点我呀:)

【题意】

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

【题解】

最后肯定会形成gcd(n,k)个环的。
对于每个环(长度为cnt。
预处理出从1..2*cnt的前缀和C[2*cnt](当成链处理就好
枚举它从起点i开始。
然后考虑它会怎么走?
1.如果c[cnt]>0,temp1加上m/cnt*C[cnt],然后对于剩余的m%cnt次走的机会。
求出c[i-1..i+m%cnt-1]这一段的最大值get_ma,减去c[i-1]就是剩余的m%cnt次能走出来的最大值了。即temp1+=get_ma-c[i-1];
temp = max(temp,temp1)
2.如果m>=cnt,那么还有一种可能,就是剩余的最后一圈留着不走完整圈,而只取一个最大的值,这个时候
如果c[cnt]>0,temp2+=(m/cnt - 1)*C[cnt],然后我们还留了一圈,也即cnt次机会可以走
则求出c[i-1..i+cnt-1]这一段的最大值get_ma2,然后再减去c[i-1]就是剩余的cnt次能走出来的最大值了,即temp2+=get_ma2-C[i-1]
temp = max(temp,tepm1)
对于每个起点i。都求出temp1,tepm2
最后return temp
就是当前这个环上走m次能得到的最大值了。
枚举所有的环取最大的temp就是答案了

【代码】


#include <bits/stdc++.h>
#define LL long long
using namespace std; const int N = 1e4;
const int M = 15; int n,m,k;
LL s;
int a[N+10],b[N*2+10],cnt;
LL c[N*2+10],mi[N*2+10][M+5];
int vis[N+10]; LL get_ma(int l,int r){
int len = r-l+1;
len = log2(len);
return max(mi[l][len],mi[r-(1<<len)+1][len]);
} LL ok(){
c[0] = 0;
for (int i = 1;i <= cnt;i++)
c[i] = b[i],c[i+cnt] = b[i];
for (int i = 1;i <= 2*cnt;i++) c[i]+=c[i-1];
for (int i = 0;i <= 2*cnt;i++) mi[i][0] = c[i];
for (int L = 1;L<=M;L++)
for (int i = 0;i <= 2*cnt;i++){
if (i+(1<<L)-1>2*cnt) break;
mi[i][L] = max(mi[i][L-1],mi[i+(1<<(L-1))][L-1]);
}
LL temp = 0;
for (int i = 1;i <= cnt;i++){
LL temp1 = 0;
//第一种情况.
//如果环的和大于0就尽量用
if (c[cnt]>0) temp1 += 1LL*m/cnt*c[cnt];
int rest = m%cnt;
if (rest>0) temp1+=get_ma(i-1,i+rest-1)-c[i-1]; LL temp2 = 0;
//第二种情况
//留cnt个
if (m>=cnt){
if (c[cnt]>0) temp2 += 1LL*(m-cnt)/cnt*c[cnt];
temp2+=get_ma(i-1,i+cnt-1)-c[i-1];
}
temp = max(temp,temp1);
temp = max(temp,temp2);
}
return temp;
} int main()
{
//freopen("D:\\rush.txt","r",stdin);
ios::sync_with_stdio(0),cin.tie(0);
int T;
cin >> T;
int kk = 0;
while (T--){
cin >> n >> s >> m >> k;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= n;i++) vis[i] = 0;
LL ans = 0;
for (int i = 1;i <= n;i++)
if (vis[i]==0){
cnt = 0;
for (int j = i;vis[j]==0;j = (j+k)>n?(j+k-n):j+k){
cnt++;
b[cnt] = a[j];
vis[j] = 1;
}
ans = max(ans,ok());
}
cout<<"Case #"<<++kk<<": ";
if (s<ans)
cout<<0<<endl;
else
cout<<s-ans<<endl;
}
return 0;
}

【hdu 6444】Neko's loop的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. 【MongoDB】windows平台搭建Mongo数据库复制集(相似集群)(三)

    关于windows平台搭建Mongo数据库复制集这个话题,我已经在前面写了两篇博客 第一篇: 怎样在windows平台搭建Mongo数据库复制集 第二篇: 数据同步和故障自适应測试 在本篇里面,咱们重 ...

  2. int、bigint、smallint 和 tinyint范围

    int.bigint.smallint 和 tinyint范围使用整数数据的精确数字数据类型.bigint从 -2^63 (-9223372036854775808) 到 2^63-1 (922337 ...

  3. BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

    4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i, ...

  4. 简单list转化为tree结构

    1 @Override public List<Module> getTree() { List<Module> list = moduleMapper.queryList() ...

  5. 大数据DDos检测——DDos攻击本质上是时间序列数据,t+1时刻的数据特点和t时刻强相关,因此用HMM或者CRF来做检测是必然! 和一个句子的分词算法CRF没有区别!

    DDos攻击本质上是时间序列数据,t+1时刻的数据特点和t时刻强相关,因此用HMM或者CRF来做检测是必然!——和一个句子的分词算法CRF没有区别!注:传统DDos检测直接基于IP数据发送流量来识别, ...

  6. Intellij IDEA社区版打包Maven项目成war包,并部署到tomcat上

    转自:https://blog.csdn.net/yums467/article/details/51660683 需求分析 我们利用 Intellij idea社区版IDE开发了一个maven的sp ...

  7. 省市区js三级联动(原创)

    看了一些网上的js三级联动,但感觉不是缺这,就是少那,决定亲自操刀写了一个,现记录如下,以备后用! <!DOCTYPE html> <html> <head> &l ...

  8. .net core虚拟目录配置

    .net core在iis上配置虚拟目录不起作用,只需要将app.UseStaticFiles中物理路径PhysicalFileProvider改为指定的路径即可,如:E:\\Html\\News a ...

  9. .net中的母版页中使用FindControl的使用

    前几天,遇到一个字段比较多的用户填写的页面(数据库表中就将近100个字段),怎么讲这些input的标签的值,保存数据库了?(使用的是母版页下面的aspx,不包括前段获取input的值,传给后台) 作为 ...

  10. 派遣函数IRP

    派遣函数是Windows驱动程序中的重要概念.驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的. 用户模式下所有对驱动程序的I/O请求,全部由操作系统转换为一个叫做IR ...