AtCoder Regular Contest 067 F - Yakiniku Restaurants
2017-10-18 19:33
459 查看
题意:
有n个餐厅排成一排,第i个与第i+1个之间距离是Ai。
有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$.
选择每种食物在哪个餐厅里吃,使收益减去走过距离最大(食物可以不按顺序吃)。
显然走过距离就是选择的餐厅所在的区间的长度,让f[i][j]表示选择的餐厅所在的区间为i到j的最大收益。
对于每个b[i][j],求出左边和右边第一个比它大的位置l,r.
那么对于左端点在l+1~i,右端点在i~r-1的区间里第j种食物肯定在第i个餐厅吃。
相当于f的一个矩阵加,打标记+前缀和。
有n个餐厅排成一排,第i个与第i+1个之间距离是Ai。
有m种食物,每种食物只能在一个餐厅里吃,第j种食物在第i个餐厅里吃的收益是$b[i][j]$.
选择每种食物在哪个餐厅里吃,使收益减去走过距离最大(食物可以不按顺序吃)。
显然走过距离就是选择的餐厅所在的区间的长度,让f[i][j]表示选择的餐厅所在的区间为i到j的最大收益。
对于每个b[i][j],求出左边和右边第一个比它大的位置l,r.
那么对于左端点在l+1~i,右端点在i~r-1的区间里第j种食物肯定在第i个餐厅吃。
相当于f的一个矩阵加,打标记+前缀和。
#include<bits/stdc++.h> #define N 5005 #define ll long long using namespace std; int n,m; int st ,top; int a [205],l ,r ; ll f ; void add(int x1,int y1,int x2,int y2,int z) { f[x1][y1]+=z;f[x2+1][y2+1]+=z; f[x1][y2+1]-=z;f[x2+1][y1]-=z; } ll sum ; int main() { scanf("%d%d",&n,&m); for(int i=2;i<=n;i++) { int tmp;scanf("%d",&tmp); sum[i]=sum[i-1]+tmp; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } for(int i=1;i<=m;i++) { memset(l,0,sizeof(l)); memset(r,0,sizeof(r)); top=0; for(int j=1;j<=n;j++) { while(top&&a[st[top]][i]<=a[j][i])r[st[top--]]=j; st[++top]=j; } while(top)r[st[top]]=n+1,top--; for(int j=n;j>=1;j--) { while(top&&a[st[top]][i]<a[j][i])l[st[top--]]=j; st[++top]=j; } for(int j=1;j<=n;j++) { add(l[j]+1,j,j,r[j]-1,a[j][i]); } } ll ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { f[i][j]+=-f[i-1][j-1]+f[i-1][j]+f[i][j-1]; if(j>=i)ans=max(ans,f[i][j]-sum[j]+sum[i]); } } cout<<ans<<endl; return 0; }
相关文章推荐
- AtCoder Regular Contest 067 F - Yakiniku Restaurants 乱搞
- 【AtCoder Regular Contest 082 F】Sandglass
- AtCoder Regular Contest 090 D People on a Line
- AtCoder Regular Contest 068 E- Snuke Line
- AtCoder Regular Contest 081 F - Flip and Rectangles 动态规划
- AtCoder Regular Contest 068 E - Snuke Line 离线+树状数组
- [AtCoder Regular Contest 080] F: Prime Flip (arc080F)
- AtCoder Regular Contest D - Remainder Reminder 取余问题
- AtCoder Regular Contest 075 2017年6月4日 C、D、E题解
- AtCoder Regular Contest 092 C - 2D Plane 2N Points 贪心 匈牙利算法模板
- AtCoder Regular Contest 077
- AtCoder Regular Contest 075 E - Meaningful Mean(树状数组)
- AtCoder Regular Contest 078 E Awkward Response
- 【构造】AtCoder Regular Contest 079 F - Namori Grundy
- AtCoder Regular Contest 080 C - 4-adjacent
- AtCoder Regular Contest 080-C - 4-adjacent
- AtCoder Regular Contest 080 E - Young Maids(线段树+优先队列)
- AtCoder Regular Contest 082
- AtCoder Regular Contest 083 D: Restoring Road Network
- 【AtCoder Regular Contest 082 A】Together