http://acm.hdu.edu.cn/showproblem.php?pid=6444

题意

一个有n个数的环,每次循环走k步,走到每个点都有具体的权值,问在任意点出发最多走m步的情况下,一开始需要拥有多少价值才能使最终总价值不少于s。

分析

对于一个环,固定步数下是有循环节的,不同循环节内的节点各不相同,根据裴蜀定理可得每个循环节的长度为 n / gcd(n, k),所以共有 gcd(n, k) 个循环节。

暴力把这些循环节找出来。

对于每个循环节,假设循环节长度为sz

①m%sz==0

此时能走整个周期,但是为了最后的值最大,先走m/sz-1圈,最后一拳走最大的一段,即求长度最大为sz的最大子段和。因为整个周期的值可能为负,所以取max(sum,0)

②m%sz≠0

这个情况下走完整数周期后还剩下m%sz步,同理,求长度最大为m%sz的最大子段和。

最后,两者取最优。

至于求最大子段和,则用单调队列来处理。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define ms(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define eps 0.0000000001
#define IOS ios::sync_with_stdio(0);cin.tie(0);
#define random(a, b) rand()*rand()%(b-a+1)+a
#define pi acos(-1)
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
const int maxn = + ;
const int maxm = + ;
const int mod = 1e9+;
ll n,m,s,k;
vector<ll> vec;
ll a[maxn],q[maxn],stk[maxn],sum[maxn];
bool vis[maxn]; ll cal(vector<ll> &v,ll tmp){
ll res=;
ll nn=v.size();
ll he=,ta=;
for(ll i=;i<nn;i++) q[i+nn]=q[i]=a[v[i]];
nn*=;
for(ll i=;i<nn;i++){
if(i==) sum[i]=q[i];
else sum[i]=sum[i-]+q[i];
if(i<tmp) res=max(res,sum[i]);
while(he<ta&&stk[he]+tmp<i) he++;
if(he<ta) res=max(res,sum[i]-sum[stk[he]]);
while(he<ta&&sum[stk[ta-]]>=sum[i]) ta--;
stk[ta++]=i;
}
return res;
}
ll solve(vector<ll>&v){
ll sz=v.size();
ll sm=;
for(ll i=;i<sz;i++) sm+=a[v[i]];
ll len1=m/sz,len2=m%sz;
ll m1=cal(v,len2);
ll m2=cal(v,sz);
m1+=max(0ll,sm)*len1;
m2+=max(0ll,sm)*((len1>=)?(len1-):);
return max(m1,m2);
} int main(){
#ifdef LOCAL
freopen("in.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
int T,cas=;
scanf("%d",&T);
while(T--){
scanf("%lld%lld%lld%lld",&n,&s,&m,&k);
for(int i=;i<n;i++){
vis[i]=false;
scanf("%lld",&a[i]);
}
vec.clear();
ll ans=;
for(ll i=;i<n;i++){
if(!vis[i]){
vis[i]=true;
vec.push_back(i);
for(ll j=(k+i)%n;(j!=i)&&(!vis[j]);j=(j+k)%n){
vis[j]=true;
vec.push_back(j);
}
ans=max(ans,solve(vec));
vec.clear();
}
}
if(ans>s) ans=;
else ans=s-ans;
printf("Case #%d: %lld\n",cas++,ans);
} return ;
}

HDU - 6444 Neko's loop(循环节+最大子段和)的更多相关文章

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

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

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

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

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

  4. HDU 3746 (KMP求最小循环节) Cyclic Nacklace

    题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...

  5. HDU 1358 Period (kmp求循环节)(经典)

    <题目链接> 题目大意: 意思是,从第1个字母到第2字母组成的字符串可由某一周期性的字串(“a”) 的两次组成,也就是aa有两个a组成: 第三行自然就是aabaab可有两个aab组成: 第 ...

  6. HDU - 5451 Best Solver(循环节+矩阵快速幂)

    Best Solver The so-called best problem solver can easily solve this problem, with his/her childhood ...

  7. hdu 5895 Mathematician QSC 指数循环节+矩阵快速幂

    Mathematician QSC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Othe ...

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

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

  9. HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

    传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/detai ...

随机推荐

  1. U盘启动盘还原

    cmd运行 diskpart list disk clean 一般都是disk 1,不过最好先list查一下 右击桌面上的计算机图标,选择管理,进入磁盘管理,能看到u盘分区是未分配的(黑色),右击,新 ...

  2. MT【273】2014新课标压轴题之$\ln2$的估计

    已知函数$f(x)=e^x-e^{-x}-2x$(1)讨论$f(x)$的单调性;(2)设$g(x)=f(2x)-4bf(x),$当$x>0$时,$g(x)>0,$求$b$的最大值;(3)已 ...

  3. Haproxy 优化

    Haproxy 自身健康检查vi /usr/local/haproxy/sbin/check_haproxy.sh #!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/b ...

  4. linux下对clamav杀毒软件的安装和配置

    下载安装 首先安装zlib库: # yum install zlib zlib-devel //安装可忽略 下载安装clamav源码包 clamav管网:http://www.clamav.net/d ...

  5. HDU1269迷宫城堡(裸Tarjan有向图求强连通分量个数)

    迷宫城堡Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  6. [POI2007]ODW-Weights(贪心)

    在byteotian公司搬家的时候,他们发现他们的大量的精密砝码的搬运是一件恼人的工作.公司有一些固定容量的容器可以装这些砝码.他们想装尽量多的砝码以便搬运,并且丢弃剩下的砝码.每个容器可以装的砝码数 ...

  7. selenium的等待~

    既然使用了selenium,那么必然牺牲了一些速度上的优势,但由于公司网速不稳定,导致频频出现加载报错,这才意识到selenium等待的重要性. 说到等待又可以分为3类, 1.强制等待 time.sl ...

  8. nginx常用配置

    nginx.conf配置文件详解 其主要分为几个模块 全局快 从开始到events块之间的一部分内容,其作用域为全局作用域 events块 主要负责Nginx服务器与用户的网络连接 常用设置: 是否开 ...

  9. webpack入门(三)webpack的api

    终于到了webpack api这一篇,我都等不及了0.0; webpack is fed a configuration object. Depending on your usage of webp ...

  10. Linux:文件系统层次结构标准(Filesystem Hierarchy Standard)

    Linux FHS_2.3标准文档:http://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.pdf