Poj   Acwing

Description

有N块木板等待被M个工匠粉刷,每块木板至多被刷一次.第i个工匠要么不粉刷,要么粉刷包含木块Si的,长度不超过Li的连续的一段木板,每粉刷一块可以得到Pi的报酬.求如何安排能使工匠们获得的总报酬最多.

1<=N<=16000,1<=M<=100

Sol

先把所有工匠按照Si从小到大排序,使我们能够按顺序进行线性Dp.

设$F[i][j]$表示前i个工匠粉刷前j块木板的最大报酬(包含空着不刷的木板).转移分为三种情况:

1.第i个工匠啥也不干 $F[i][j]=F[i-1][j]$

2.第j块木板空着不刷 $F[i][j]=F[i][j-1]$

3.第i个木匠刷k+1到j块木板 $F[i][j]=max(F[i-1][k]+Pi*(j-k)) (j-Li<=k<=Si-1,j>=Si)$

然后用单调队列优化第3个式子

$F[i][j]=Pi*j+max(F[i-1][k]-Pi*k)$ 单调队列维护$max(F[i-1][k]-Pi*k)$就OK了

单调队列维护时元素的进出序列要弄清楚是队首还是队尾,不要搞混了 (大概也只有我会搞混 $ovo$

Code

 #include<iostream>
#include<cstdio>
#include<deque>
#include<algorithm>
#define il inline
#define Rg register
#define fr front
#define bk back
#define go(i,a,b) for(Rg int i=a;i<=b;i++)
#define yes(i,a,b) for(Rg int i=a;i>=b;i++)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int n,m,f[][];
deque<int>q;
struct node{int l,p,s;}a[];
il int cal(int i,int x){return f[i-][x]-a[i].p*x;}
il bool cmp(node x,node y){return x.s<y.s;}
int main()
{
n=read(),m=read();
go(i,,m)a[i]=(node){read(),read(),read()};
sort(a+,a+m+,cmp);
go(i,,m)
{
q.clear();
go(k,max(a[i].s-a[i].l,),a[i].s-)
{
while(q.size() && cal(i,q.bk())<=cal(i,k))q.pop_back();
q.push_back(k);
}
go(j,,n)
{
f[i][j]=max(f[i][j-],f[i-][j]);
if(j>=a[i].s)
{
while(q.size() && q.fr()<j-a[i].l)q.pop_front();
if(q.size())f[i][j]=max(f[i][j],a[i].p*j+cal(i,q.fr()));
}
}
}
printf("%d\n",f[m][n]);
return ;
}

随机推荐

  1. LeetCode73 Set Matrix Zeroes

    题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.(Me ...

  2. Shell 基本运算符 1

    Shell 和其他编程语言一样,支持多种运算符,包括: 算术运算符 关系运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr ...

  3. C#中的?操作符

    一.1个?的用法 1. 表示可空数据类型,如 int? bool? 2. 跟在对象后,如该对象为null,则不会触发空值异常,且整个表达式返回null,如: string kk = "123 ...

  4. laravel 中使用tinker注入数据到数据库

  5. display的值和对应的意义

    none:隐藏对应元素,不为隐藏的对象保留其物理空间 block:指定对象为块元素 inline:指定对象为内联元素 inline-block:指定对象为内联块元素 table:指定对象为块元素的表格 ...

  6. CSS3 Box-shadow 阴影效果用法

    一.基本用法: 二.内阴影用法: 三.阴影扩展长度值: box-shadow: 4rpx 4rpx 8rpx #aaa;

  7. TabHost选项卡的实现(一):使用TabActivity实现

    一. TabHost的基本开发流程 TabHost是一种非常实用的组件,可以很方便的在窗口上防止多个标签页,每个标签页相当于获得了一个外部容器相同大小的组件摆放区域. 我们熟悉的手机电话系统" ...

  8. HTML静态网页--图片热点

  9. Wunder Fund Round 2016 (Div. 1 + Div. 2 combined)

    现在水平真的不够.只能够做做水题 A. Slime Combining 题意:就是给n个1给你.两个相同的数可以合并成一个数,比如说有两个相同的v,合并后的值就是v+1 思路:直接模拟栈 #inclu ...

  10. Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory

    遇到问题 在服务器上运行 nexus 出现Native memory allocation (mmap) failed to map 838860800 bytes for committing re ...