【题解】Atcoder ARC#67 F-Yakiniku Restaurants
觉得我的解法好简单,好优美啊QAQ
首先想想暴力怎么办。暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值。这样的复杂度是 \(O(n ^{2} m)\) 的。但是这样明显能够感觉到我们重复计算了很多东西,因为区间 \((l, r)\) 的答案与区间 \((l + 1, r)\) 的答案并不是独立的。
我们可以考虑一下扫描线的做法。用一根扫描线从右往左扫左端点,同步维护所有以 \(l\) 为左端点的区间。由于我们现已经求出了所有以 \(l + 1\) 为左端点的区间答案(这里的答案指从 \(l -> r\) 中吃东西所能获得的最大权值),我们可以求出 \(l + 1, r\) 到 \(l, r\) 的增量变化,那么 \(ans[l][r] = ans[l + 1][r] + t\)。
这个答案的增量显然只与 \(l\) 端点所能获得的权值有关。考虑第 j 个购物券,我们可以维护一个值单调递增的单调栈表示在每一个地点使用 j 购物券能获得最大权值的区间。弹栈的时候,我们用 \(val[i][j] - S[j][top].num\) 即可求出增量。这个增量会增加在 \(ans[i][j] -> ans[i][k]\) 这样的一个区间中。差分就可以解决了。
感觉自己讲起来好混乱啊……すみません……
#include <bits/stdc++.h>
using namespace std;
#define maxn 5005
#define int long long
#define maxm 250
int n, m, dis[maxn], val[maxn][maxm];
int Ans, ans[maxn][maxn], Q[maxn]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} struct node
{
int num, id;
node(int _id = , int _num = ) { num = _num, id = _id; }
}S[maxm][maxn]; signed main()
{
n = read(), m = read();
for(int i = ; i <= n; i ++) dis[i] = read() + dis[i - ];
for(int i = ; i <= n; i ++)
for(int j = ; j <= m; j ++) val[i][j] = read();
for(int i = ; i <= m; i ++) S[i][].id = n + ;
for(int i = n; i >= ; i --)
{
for(int j = ; j <= m; j ++)
{
int top = Q[j];
ans[i][i] += val[i][j]; ans[i][i + ] -= val[i][j];
while(top && S[j][top].num <= val[i][j])
{
int l = S[j][top].id, r = S[j][top - ].id;
int t = val[i][j] - S[j][top].num;
ans[i][l] += t, ans[i][r] -= t;
top --;
}
S[j][++ top] = node(i, val[i][j]);
Q[j] = top;
}
}
for(int i = n; i; i --)
{
for(int j = i; j <= n; j ++)
ans[i][j] += ans[i][j - ];
for(int j = i; j <= n; j ++) ans[i][j] += ans[i + ][j];
for(int j = i; j <= n; j ++)
Ans = max(Ans, ans[i][j] - dis[j] + dis[i]);
}
printf("%lld\n", Ans);
return ;
}
【题解】Atcoder ARC#67 F-Yakiniku Restaurants的更多相关文章
- 【AtCoder】ARC067 F - Yakiniku Restaurants 单调栈+矩阵差分
[题目]F - Yakiniku Restaurants [题意]给定n和m,有n个饭店和m张票,给出Ai表示从饭店i到i+1的距离,给出矩阵B(i,j)表示在第i家饭店使用票j的收益,求任选起点和终 ...
- AtCoder Regular Contest 067 F - Yakiniku Restaurants
题意: 有n个餐厅排成一排,第i个与第i+1个之间距离是Ai. 有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$. 选择每种食物在哪个餐厅里吃,使收益减去走 ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- [题解] Atcoder ARC 142 E Pairing Wizards 最小割
题目 建图很妙,不会. 考虑每一对要求合法的巫师(x,y),他们两个的\(a\)必须都大于\(min(b_x,b_y)\).所以在输入的时候,如果\(a_x\)或者\(a_y\)小于\(min(b_x ...
- [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学
题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...
- [atcoder contest 010] F - Tree Game
[atcoder contest 010] F - Tree Game Time limit : 2sec / Memory limit : 256MB Score : 1600 points Pro ...
- [题解] Atcoder Regular Contest ARC 147 A B C D E 题解
点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...
- 【题解】Atcoder ARC#90 F-Number of Digits
Atcoder刷不动的每日一题... 首先注意到一个事实:随着 \(l, r\) 的增大,\(f(r) - f(l)\) 会越来越小.考虑暴力处理出小数据的情况,我们可以发现对于左端点 \(f(l) ...
随机推荐
- 宁波Uber优步司机奖励政策(1月4日~1月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- .net core 基于multipart/form-data的文件上传,这里以图片上传为例
首先传递的数据格式大概如下: 然后就可以在后端获取数据了:直接上代码了哈: [HttpPost] ///分别获取 data数据和调用图片上传方法 public async Task< ...
- Calendar 实现日历实例
import java.text.ParseException; import java.util.Calendar; import java.util.GregorianCalendar; impo ...
- Emmet 技巧
1. Lorem 产生一段 dummy text 2. $ 变量的使用 3. 插入img的长度和宽度 使用快捷键ctrl+u插入图片的长度和宽度 注意光标要停留在图片文件名上. 其他在Sublime中 ...
- CentOS 7.2安装11g Grid Infrastructure
Preface Oracle claimed that 11g RAC is supported on Redhat Linux 7 and above version,but the ...
- Selenium(Python)驱动Firefox浏览器
我的版本是Firefox Setup 52.7.0.exe+geckodriver-v0.15.0-win64.zip, 把驱动geckodriver.exe放到Python安装目录下, 也可以指定驱 ...
- TPO-10 C2 Return a literature book
TPO-10 C2 Return a literature book 第 1 段 1.Listen to a conversation between a student and an employe ...
- BehaviorDesigner学习
行为树: 行为树设计师插件是一个专门为unity设计的AI插件. 学习用!!!插件地址:链接:http://pan.baidu.com/s/1dF2okPN 密码:b43m 通过继承Behavior中 ...
- linux系统简单命令
# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostn ...
- 【label】标签组件说明
label标签组件 用来改进表单组件的可用性,使用for属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件.目前可以绑定的控件有:<button/>, <che ...