Neko's loop HDU-6444(网络赛1007)
题意就是给出n个数,在n个数上每次跳k个数,最多可以跳m次,你可以选择跳任意次,也可以都不跳,问你为了达到目标了快乐值至少在开始的需要多少快乐值。
题目可以转换成找出循环节,然后再循环节上疯狂试探我可以得到的最大快乐值,然后减一下。
刚开始想着找循环节,只找了一个,用栈存,然后发现可能会有多个循环节,需要考虑多个循环节的最大值,就转成vector存了。
对于每一个循环节,先找一次长度为m的序列,但是m可能比我的循环节来的大,所以我考虑循环起来。让 y 表示的我循环起来的圈数,y = m / len, x表示剩余的还没走的数,x = m % len,如果一圈可以获得的最大值,我就可以直接加上它,一开始我y圈的快乐值算成了y*sum,然后再去求最后x步的最大快乐值,然后相加,最后错了...炜神给了样例
1
5 1000 30 2
-1 -2 -3 -4 15
这时候我可以循环六圈,但是答案却不是这么算的,因为题目说我可以在任何时候停止,所以我可以在从15开始,到第五圈的15的时候提前结束,这样最后的负数我可以不取到,
所以这时候能直接计算出的最大值只有前y-1圈,然后特判能否循环起来,如果至少可以循环一圈的话,把 x = x + len,对于最后一圈进行特判,求出最后一圈加上剩余一点点步数可以得到的最大的快乐值。然后在相加。
这时候我最后一步的范围就是(0, 2*len),所以能走到的最大范围是(len-1,3*len),所以在求最大连续子串和的时候前缀和的数量应该开三倍空间。然后这题用deque会wa,可能是爆了吧...
#include<map>
#include<set>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x & (-x))
#define INOPEM freopen("in.txt", "r", stdin)
#define OUTOPEN freopen("out.txt", "w", stdout) typedef unsigned long long int ull;
typedef long long int ll;
const double pi = 4.0*atan(1.0);
const int inf = 0x3f3f3f3f;
const ll INF = 1e18+;
const int maxn = 1e5;
const int maxm = 1e9+;
const int mod = 1e9+;
using namespace std; ll n, m;
int T, tol;
ll s, k;
bool vis[maxn];
ll a[maxn];
ll b[maxn];
ll sum[maxn];
vector<ll> vec[maxn];
struct Node {
int first;
ll second;
};
Node q[maxn]; void init() {
tol = ;
memset(q, , sizeof q);
for(int i=; i<maxn; i++) vec[i].clear();
memset(vis, , sizeof vis);
} ll solve(int op, int n, ll m) {
ll ans = ;
memset(sum, , sizeof sum);
for(int i=; i<n; i++) sum[i] = i== ? vec[op][i] : sum[i-] + vec[op][i];
for(int i=n; i<*n; i++) sum[i] = sum[i-] + vec[op][i-n];
for(int i=*n; i<*n; i++) sum[i] = sum[i-] + vec[op][i-*n];
// for(int i=0; i<3*n; i++) printf("%lld%c", sum[i], i==3*n-1 ? '\n' : ' ');
int head = ;
int tail = ;
for(int i=; i<*n; i++) {
while(head < tail && q[tail-].second > sum[i-]) tail--;
while(head < tail && q[head].first + m < i) head++;
q[tail].first = i-;
q[tail].second = sum[i-];
tail++;
if(ans < sum[i] - q[head].second) {
ans = sum[i] - q[head].second;
}
}
return ans;
} int main() {
int cas = ;
scanf("%d", &T);
while(T--) {
init();
scanf("%lld%lld%lld%lld", &n, &s, &m, &k);
for(int i=; i<n; i++) scanf("%lld", &a[i]);
for(int i=; i<n; i++) {
if(!vis[i]) {
int pos = i;
while(!vis[pos]) {
vis[pos] = ;
vec[tol].push_back(a[pos]);
pos = (pos + k) % n;
}
tol++;
}
}
// for(int i=0; i<tol; i++) for(int j=0; j<vec[i].size(); j++) printf("%lld%c", vec[i][j], j==vec[i].size()-1 ? '\n' : ' ');
ll ans = -inf;
for(int i=; i<tol; i++) {
ll res = -inf;
int len = vec[i].size();
ll tmp = ;
for(int j=; j<len; j++) tmp += vec[i][j];
res = solve(i, len, m);
ans = max(ans, res);
if(tmp < ) continue;
ll x = m % len;
ll y = m / len;
tmp = max(y-, 0ll) * tmp;
if(y >= ) x += len;
res = max(res, solve(i, len, x) + tmp);
ans = max(ans, res);
}
ans = max(0ll, s-ans);
printf("Case #%d: %lld\n", cas++, ans);
}
return ;
}
Neko's loop HDU-6444(网络赛1007)的更多相关文章
- hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解
题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手 ...
- HDU 6444 Neko's loop ( 2018 CCPC 网络赛 && 裴蜀定理 && 线段树 )
题目链接 题意 : 给出一个 n 个元素的环.可以任意选择起点.选完起点后.可以行走 m 步.每次前进 k 个单位.所走到的点将产生正或负贡献.问你一开始得准备多少才能使得初始资金加上在环上获取最大利 ...
- hdu 5874 Friends and Enemies icpc大连站网络赛 1007 数学
#include<stdio.h> #include<iostream> #include<algorithm> #include<math.h> #i ...
- hdu5443(2015长春赛区网络赛1007)暴力
题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. #include< ...
- HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...
- Hdu 4762 网络赛 高精度大数模板+概率
注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放, ...
- 2018CCPC网络赛
A - Buy and Resell HDU - 6438 The Power Cube is used as a stash of Exotic Power. There are nn cities ...
- HDU 4734 F(x) (2013成都网络赛,数位DP)
F(x) Time Limit: 1000/500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 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. ...
随机推荐
- python3 常见的两种文件上传方法
1.上传页面带input type格式send_keys传值方式上传不能大于60k(具体看开发设置的value)文件大小 fx.find_element_by_id('xx').send_keys(r ...
- React Native之微信分享(iOS Android)
React Native之微信分享(iOS Android) 在使用React Native开发项目的时候,基本都会使用到微信好友或者微信朋友圈分享功能吧,那么今天我就带大家实现以下RN微信好友以及朋 ...
- java依赖的斗争:依赖倒置、控制反转和依赖注入
控制反转(Inversion Of Controller)的一个著名的同义原则是由Robert C.Martin提出的依赖倒置原则(Dependency Inversion Principle),它的 ...
- mysql_linux(centos7 mysql 5.7.19)
centos7 mysql 5.7.19安装 1.解压文件 [root@centos3 ~]# tar -zxvf mysql-5.7.19-linux-glibc2.12-x86_64.tar.g ...
- [转帖]nginx配置ssl加密(单/双向认证、部分https)
nginx配置ssl加密(单/双向认证.部分https) https://segmentfault.com/a/1190000002866627 nginx下配置ssl本来是很简单的,无论是去认证 ...
- vue-resources&axios
vue-resource vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应. vue-resource特点: 体积小 vue-re ...
- 连接mysql 出现 1005 error(150) , error(121)的错误
1.显示不能创建表 出现150错误 将检查是因为 我的user 表示拷贝过来的所以它设置的编码格式是utf-8 而我又新创建的表没有添加编码格式,所以它认为这两个关联的表之间的编码格式不匹配. 2.出 ...
- python爬虫之线程池和进程池
一.需求 最近准备爬取某电商网站的数据,先不考虑代理.分布式,先说效率问题(当然你要是请求的太快就会被封掉,亲测,400个请求过去,服务器直接拒绝连接,心碎),步入正题.一般情况下小白的我们第一个想到 ...
- requests 使用免费的代理ip爬取网站
import requests import queue import threading from lxml import etree #要爬取的URL url = "http://xxx ...
- mysql第一天【mysqldump导出数据和mysql导入数据】
1.使用mysqldump导出数据到本地sql文件 在mysql>bin下执行: 例如: mysqldump -hrm-2ze8mpi5i65429l1qvo.mysql.rds.aliyunc ...