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 to jump on the loop.She can start at anywhere. If she stands at i−th grid, she will get ai happy value, and she can spend one unit energy to go to ((i+k)modn)−th grid. If she has already visited this grid, she can get happy value again. Neko can choose jump to next grid if she has energy or end at anywhere.
Neko has m unit energies and she wants to achieve at least s happy value.
How much happy value does she need at least before she jumps so that she can get at least s happy value? Please note that the happy value which neko has is a non-negative number initially, but it can become negative number when jumping
输入:
The first line contains only one integer T(T≤50), which indicates the number of test cases.
For each test case, the first line contains four integers n,s,m,k(1≤n≤104,1≤s≤1018,1≤m≤109,1≤k≤n).
The next line contains n integers, the i−th integer is ai−1(−109≤ai−1≤109)
该题关键在于:一个环,环上每点有一个权值,可以从任意点开始走,问至多走m步情况下所经过点的权值和最大是多少。主要比较难想的在于O(nlogn)地求一个环上至多长为k的字段和的最大值。
主要思路:可以在扫一遍的过程中一个个地求以i为结尾的至多长为k的字段和的最大值。维护一个单调队列,保证队头一直是点{i-k..i-k+1....i-i}的前缀和中的最小值,i的前缀和减去该最小值即为i为结尾的至多长为k的字段和的最大值。
单调队列的维护:1.若队头的时间戳与i距离大于k,则队头出队。2.每次将i的前缀和入队的时候,循环进行操作:队尾若大于i的前缀和则队尾出队。
#include<bits/stdc++.h>
#define rep(i,a,b) for(long long i=a;i<=b;++i)
using namespace std;
long long n,m,s,k;
const long long MAXN=1e4+;
long long a[MAXN];
void Input()
{
scanf("%lld%lld%lld%lld",&n,&s,&m,&k);
rep(i,,n-) scanf("%lld",a+i);
}
long long gcd(long long a,long long b)
{
return b==?a:gcd(b,a%b);
}
long long ring[MAXN];
long long head;
long long vis[MAXN];
long long pre[MAXN];
void init()
{
memset(vis,,sizeof(vis));
}
int tail=;
struct Qu
{
long long t,val;
Qu() {}
Qu(long long _val,long long _t)
{
t=_t;
val=_val;
}
}q[*MAXN];
void update(long long idx)
{
Qu one(pre[idx],idx+);
while(tail>=head)
{
if(q[tail].val>=one.val) tail--;
else break;
}
q[++tail]=one;
}
void debug2(long long i)
{
printf("i:%lld\n",i);
rep(i,head,tail)
{
printf("val:%lld t:%lld\n",q[i].val,q[i].t);
}
}
long long calc(long long lim,long long len)
{
// printf("lim:%lld\n",lim);
long long presum=;
rep(i,len,*len-) ring[i]=ring[i-len];
rep(i,,*len-)
{
presum+=ring[i];
pre[i]=presum;
// printf("%lld ",pre[i]);
}
head=;
tail=;
long long maxans=;
q[head]=Qu(,);
rep(i,,*len-)
{
update(i); int nowlen=(i+)-q[head].t;
if(nowlen>lim)
{
head++;
}
// debug2(i); //printf("maxans:%lld val:%lld\n",maxans,pre[i]-q[head].val);
maxans=max(maxans,pre[i]-q[head].val);
}
return maxans; }
void debug(long long len)
{
rep(i,,len-) printf("%d ",ring[i]);
printf("\n");
}
void work(long long icase)
{
long long num=gcd(n,k);
long long ans=;
rep(i,,n-)
{
if(vis[i]) continue;
head=;
long long sum=;
long long len=;
for(long long j=i;!vis[j];j=(j+k)%n)
{
// printf("j:%lld\n",j);
ring[head++]=a[j];
sum+=a[j];
len++;
vis[j]=;
}
long long time=m/len;
long long maxseq;
if(sum<)
{
sum=;
maxseq=calc(min(len - , m), len);
}
else maxseq=calc(m%len,len);
// debug(len);
long long other=calc(len-,len);
if(m>=len)
{
if (other > sum + maxseq){
long long res = (time-) * sum;
long long ians = res + other;
ans = max(ians,ans);
}else{
long long res=time*sum;
long long ians=res+maxseq;
ans=max(ians,ans);
}
}else{
long long res=time*sum;
long long ians=res+maxseq;
ans=max(ians,ans);
}
}
long long finalans=s-ans;
if(finalans<) finalans=;
printf("Case #%lld: %lld\n",icase,finalans);
}
int main()
{
long long T;
scanf("%lld",&T);
rep(tt,,T)
{
init();
Input();
work(tt);
}
return ;
}
2018 CCPC网络赛 hdu6444 Neko's loop的更多相关文章
- 2018 CCPC网络赛
2018 CCPC网络赛 Buy and Resell 题目描述:有一种物品,在\(n\)个地点的价格为\(a_i\),现在一次经过这\(n\)个地点,在每个地点可以买一个这样的物品,也可以卖出一个物 ...
- HDU 6444 Neko's loop ( 2018 CCPC 网络赛 && 裴蜀定理 && 线段树 )
题目链接 题意 : 给出一个 n 个元素的环.可以任意选择起点.选完起点后.可以行走 m 步.每次前进 k 个单位.所走到的点将产生正或负贡献.问你一开始得准备多少才能使得初始资金加上在环上获取最大利 ...
- 2018 CCPC网络赛 几道数学题
1002 Congruence equation 题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=6439 题解 : https://www.zyb ...
- 2018 CCPC 网络赛 Buy and Resell
The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1,2,…,n where allowed ...
- 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...
- 【2018 CCPC网络赛 1004】Find Integer(勾股数+费马大定理)
Problem Description people in USSS love math very much, and there is a famous math problem . give yo ...
- 【2018 CCPC网络赛】1001 - 优先队列&贪心
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6438 获得最大的利润,将元素依次入栈,期中只要碰到比队顶元素大的,就吧队顶元素卖出去,答案加上他们期中 ...
- 【2018 CCPC网络赛】1009 - 树
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6446 题目给出的数据为一棵树,dfs扫描每条边,假设去掉某条边,则左边 x 个点,右边 n-x 个点, ...
- 【2018 CCPC网络赛】1003 - 费马小定理
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6440 这题主要是理解题意: 题意:定义一个加法和乘法,使得 (m+n)p = mp+np; 其中给定 ...
随机推荐
- 后缀html和htm文件的区别
后缀html和htm文件的区别: (1)如果一个网站有index.html和index.htm,默认情况下,优先访问.html. (2).htm后缀是为了兼容以前的dos系统8.3的命名规范
- BinDiff安装使用教程
一.说明 大概一两年前在<漏洞战争:软件漏洞分析精要>听到bindiff(和补丁比较法),但一直都没去使用.前两天再回头看书感觉需要使用一翻,整个过程下来还是遇到了一些问题,值得记录一番. ...
- mysql 执行sql流程
客户端发送sql 语句后的堆栈 #0 0x0000000100370565 in do_command(THD*) at percona-server-Percona-Server-5.6.37-82 ...
- postman安装
安装包下载下来,解压缩到你喜欢的位置. 打开 Chrome 浏览器的「扩展程序」 点击「加载已解压的扩展程序...」按钮,找到你刚刚下载的安装包的位置,点击确定. 你去看看 Windows 的开始菜单 ...
- mysql存储过程和执行计划案例
开启event_scheduler指令: SET GLOBAL event_scheduler = ON;SET @@global.event_scheduler = ON;SET GLOBAL ev ...
- C#UDP广域网,局域网通信-原理分析
一.UDP局域网通信. 这个比较简单,关于局域网中的2台或者更多的计算机之间的UDP通信,网络上一大把,直接复制粘贴就可以使用,原理也非常简单.所以,本文不做详细介绍. 二.UDP广域通信(包括路由器 ...
- balcanced-binary-tree
题目描述 Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced bi ...
- 【tomcat环境搭建】一台服务器上部署多个tomcat
一台服务器上面如何部署多个tomcat?其实linux和windows步骤都差不多,都是: 第一步:解压tomcat安装包后,复制一份并且重命名:多个tomcat就多复制一份 第二步:将复制的tomc ...
- SQL-57 使用含有关键字exists查找未分配具体部门的员工的所有信息。
题目描述 使用含有关键字exists查找未分配具体部门的员工的所有信息.CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` ...
- Frist one
2017.11.27 10:20am 今天也许只是普通的一个周一上午 但是我希望在多年以后 在我回望这些年的努力学习中 今天会是最浓墨重彩的一笔 我时常感到焦虑 对未来的焦虑 对感情的焦虑 以至于 我 ...