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. Javascript中的定时调用函数setInterval()和setTimeout()

    首先介绍这两个函数 一.setInterval() 按照指定的周期来调用函数或表达式,执行多次.(时间单位:ms) timer = setInterval("content =documen ...

  2. CH1401 兔子与兔子

    #include<bits/stdc++.h> using namespace std; ,p=; typedef unsigned long long ULL;//自然溢出 ULL f[ ...

  3. hdu 5793 A Boring Question(2016第六场多校)

    A Boring Question Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  4. 云原生生态周报 Vol. 6 | KubeCon EU 特刊

    5 月 26日,2019 年第一个 KubeCon + CloudNativeCon 在巴塞罗那成功闭幕.本届 KubeCon 共吸引了超过 7700 名与会者,相较去年哥本哈根大会的 4300 余名 ...

  5. oracle 需要当心的WHERE子句

    某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. 在下面的例子里, ‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. 不使用索引: ...

  6. js实现方块的碰撞检测

    文章地址:https://www.cnblogs.com/sandraryan/ 个人感觉.方块的碰撞检测比圆形麻烦~~ <!DOCTYPE html> <html lang=&qu ...

  7. 基于jquery读取input上传的文件内容

    <script src="/static/js/jquery.js"></script> // 前端页面实现头像预览 // 当用户选中文件之后,也就是头像的 ...

  8. Pytorch使用GPU

    pytorch如何使用GPU在本文中,我将介绍简单如何使用GPU pytorch是一个非常优秀的深度学习的框架,具有速度快,代码简洁,可读性强的优点. 我们使用pytorch做一个简单的回归. 首先准 ...

  9. 2002年NOIP普及组复赛题解

    题目涉及算法: 级数求和:入门题: 选数:搜索: 产生数:搜索.高精度: 过河卒:动态规划. 级数求和 题目链接:https://www.luogu.org/problemnew/show/P1035 ...

  10. [转]Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...