博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019牛客暑期多校训练营(第六场)- Upgrading Technology
阅读量:4951 次
发布时间:2019-06-11

本文共 2701 字,大约阅读时间需要 9 分钟。

模拟 + 二维st表

枚举每一次所有技能全部到达的level,然后分别对每个技能花费为负的情况往上加,前提是至少有一个不能加,因为可能下一次的全部技能到达的level拿到的收益是个负数。

每次枚举都不拿多的d才可以可以遍历所有情况。

分别枚举每个技能的最小cost的时候,可以用st表来维护前缀和。

#include 
#define INF 23333333333333333#define full(a, b) memset(a, b, sizeof a)#define __fastIn ios::sync_with_stdio(false), cin.tie(0)#define pb push_backusing namespace std;typedef long long LL;inline int lowbit(int x){ return x & (-x); }inline int read(){ int ret = 0, w = 0; char ch = 0; while(!isdigit(ch)){ w |= ch == '-', ch = getchar(); } while(isdigit(ch)){ ret = (ret << 3) + (ret << 1) + (ch ^ 48); ch = getchar(); } return w ? -ret : ret;}inline int lcm(int a, int b){ return a / __gcd(a, b) * b; }template
inline A fpow(A x, B p, C lyd){ A ans = 1; for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd; return ans;}const int N = 2000;int n, m, d[N], _, c[N][N], cnt[N], cs, lb[N];LL pre[N][N], st[N][N][11], b[N];LL query(int k, int l, int r){ int t = lb[r - l + 1]; return min(st[k][l][t], st[k][r - (1 << t) + 1][t]);}int main(){ lb[0] = -1; for(int i = 1; i < N; i ++) lb[i] = lb[i>>1] + 1; for(scanf("%d", &_); _; _ --){ scanf("%d%d", &n, &m); for(int i = 1; i <= n; i ++){ for(int j = 1; j <= m; j ++) scanf("%d", &c[i][j]); } for(int i = 1; i <= m; i ++) scanf("%d", &d[i]); for(int i = 1; i <= n; i ++){ for(int j = 1; j <= m; j ++) pre[i][j] = pre[i][j - 1] + c[i][j]; } for(int i = 1; i <= m; i ++) b[i] = b[i - 1] + d[i]; for(int i = 1; i <= n; i ++){ for(int j = 1; j <= m; j ++) st[i][j][0] = pre[i][j]; } for(int k = 1; k <= n; k ++){ for(int j = 1; j < 11; j ++){ for(int i = 1; (1 << j) + i - 1 <= m; i ++) st[k][i][j] = min(st[k][i][j - 1], st[k][i + (1 << (j - 1))][j - 1]); } } vector
ans; for(int k = 0; k <= m; k ++){ LL val = b[k]; for(int i = 1; i <= n; i ++) val -= pre[i][k]; if(k != m){ LL sub = -INF; bool flag = false; for(int i = 1; i <= n; i ++){ // k + 1...m minimum cost LL x = query(i, k + 1, m) - pre[i][k]; sub = max(sub, x); if(x > 0) flag = true; if(x <= 0) val -= x; } if(!flag) val += sub; } ans.pb(val); } printf("Case #%d: %lld\n", ++cs, *max_element(ans.begin(), ans.end())); } return 0;}

转载于:https://www.cnblogs.com/onionQAQ/p/11298153.html

你可能感兴趣的文章
BZOJ2087[Poi2010] Sheep
查看>>
将默认的select选择框样式清除
查看>>
sql server 查看表的外键
查看>>
RPM管理工具
查看>>
Python学习之路目录(收藏整理)
查看>>
表格里使用text-overflow后不能隐藏超出的文本的解决方法
查看>>
[UE4]事件处理(Handling Events)和委托(Delegate)代码示例(一)
查看>>
读《java核心技术卷一》有感
查看>>
Mac上Markdown的使用
查看>>
选修所有课程的学生信息
查看>>
输出斐波纳契数列
查看>>
git
查看>>
JS数组定义【收藏】
查看>>
2015个人年度总结
查看>>
ios copy
查看>>
SQLServer 2008的数据库镜像实施笔记(转)
查看>>
第四次 博客作业
查看>>
pymysql 读取数据库没有字段
查看>>
【nginx】关于gzip压缩
查看>>
Spring Boot 邮件发送的 5 种姿势!
查看>>