【题解】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) ...
随机推荐
- windown reids
记录Windown安装Redis和php_redis扩展 和Linux系统不同windown中不需要编译安装:只需要下对版本拖拽过去即可: 首先安装redis服务: 可以百度下一个,只要注意系统版本即 ...
- WSL跑linux服务程序
前段时间折腾了一次WSL下的Apache,无奈遇到各种奇葩问题,总是解决不了,最终放弃,甚至得出了一个现在看来比较可笑的结论:WSL是不可能跑Linux服务程序的! 当时的思路想歪了,由于Apache ...
- unity发布自定义分辨率
如果你需要发布unity时想要使用自己设置的分辨率仅需要一下几个步骤: 打开Build Setting->PlayerSetting->Resolution and Presentatio ...
- 【转载】IOS之禁用UIWebView的默认交互行为
原文地址 :IOS之禁用UIWebView的默认交互行为 http://my.oschina.net/hmj/blog/111344 UIKit提供UIWebView组件,允许开发者在App中嵌入We ...
- HTML 之 表单
关于HTML的表单 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...
- HTML/JSP中一些单书名号标签的用途<%-- --%><!-- --><%@ %><%! %><% %><%= %>
注释 <%-- --%>是(JSP)隐式注释,不会在页面显示的注释 <!-- -->是(Html)显示注释,会在JSP页面显示 关于注释还有单行隐式注释//和多行隐式注释/* ...
- 基于物品的协同过滤算法(ItemCF)
最近在学习使用阿里云的推荐引擎时,在使用的过程中用到很多推荐算法,所以就研究了一下,这里主要介绍一种推荐算法—基于物品的协同过滤算法.ItemCF算法不是根据物品内容的属性计算物品之间的相似度,而是通 ...
- 统计学习三:2.K近邻法代码实现(以最近邻法为例)
通过上文可知k近邻算法的基本原理,以及算法的具体流程,kd树的生成和搜索算法原理.本文实现了kd树的生成和搜索算法,通过对算法的具体实现,我们可以对算法原理有进一步的了解.具体代码可以在我的githu ...
- 深入理解eos账户体系 active和action
在eos中,账户是一个非常重要的概念. 账户分为两部分组成 一种是active 一种是action. 智能合约本质上来讲就是一个action加上一个回馈脚本程序.任何智能合约都有这俩个部分组成. 那么 ...
- 【转】jQuery最佳实践
上周,我整理了<jQuery设计思想>. 那篇文章是一篇入门教程,从设计思想的角度,讲解"怎么使用jQuery".今天的文章则是更进一步,讲解"如何用好jQu ...