自闭的一批....为什么斜率优化能这么自闭。

首先看到这个题的第一想法一定是按照一个维度进行排序。

那我们不妨直接按照\(h_i\)排序。

我们令\(dp[i]\)表示到了第\(i\)个矩形的答案是多少。

之后我们会发现,对于\(dp[i]\)的转移

\[dp[i]=dp[j-1]+h[j]*mn[j][i]
\]

其中\(mn[j][i]\)表示\(j到i\)的最小值。

qwq我们发现对于一个含有最值的柿子,他没法转移qwq

那我们不妨仔细考虑一下。

对于一个排在\(i\)后面的矩阵\(j\),如果他的\(w\)小于前缀\(w_{max}\),那么他就可以直接和之前某个矩阵合买了。

那这样就能去掉很多没有用的矩阵

剩下的矩阵就是一个\(h\)单调不升,\(w\)单调不降的序列。

那么这时候

\(dp[i]=max(dp[j-1]+h[j]*w[i])\)

经过推柿子

\[\frac{dp[j-1]-dp[k-1]}{h[j]-h[k]} > -w[i]
\]

然后直接斜率优化就可以qwq

这里有两个要注意的地方!!!!!!

首先,我们要比较的是当前的\(w\)和前缀\(w\)的最大值,而不能比较他的和上一个矩阵(因为上一个矩阵可能也是被完全替代的)。

其次!因为\(h[j]-h[k]<0\) 所以移项要改变!符号!

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define mk make_pair
#define ll long long
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const int maxn = 2e5+1e2;
struct Node{
int h,w;
};
Node a[maxn];
int dp[maxn];
int n;
struct Point{
int x,y;
};
Point q[maxn];
int chacheng(Point x,Point y)
{
return x.x*y.y-x.y*y.x;
}
bool count(Point i,Point j,Point k)
{
Point x,y;
x.x=k.x-i.x;
x.y=k.y-i.y;
y.x=k.x-j.x;
y.y=k.y-j.y;
if (chacheng(x,y)>=0) return true;
return false;
}
int head=1,tail=0;
void push(Point x)
{
while(tail>=head+1 && count(q[tail-1],q[tail],x)) tail--;
q[++tail]=x;
}
void pop(int lim)
{
while (tail>=head+1 && q[head+1].y-q[head].y<lim*(q[head+1].x-q[head].x)) head++;
}
bool cmp(Node a,Node b)
{
if(a.h==b.h) return a.w>b.w;
return a.h>b.h;
}
signed main()
{
n=read();
for (int i=1;i<=n;i++) a[i].w=read(),a[i].h=read();
sort(a+1,a+1+n,cmp);
push((Point){a[1].h,0});
dp[1]=a[1].w*a[1].h;
int mx = a[1].w;
for (int i=2;i<=n;i++)
{
if (a[i].w<=mx)
{
dp[i]=dp[i-1];
continue;
}
mx=max(mx,a[i].w);
dp[i]=dp[i-1]+a[i].w*a[i].h;
pop((-1ll)*a[i].w);
Point now = q[head];
dp[i]=min(now.y+a[i].w*now.x,dp[i]);
push((Point){a[i].h,dp[i-1]});
}
cout<<dp[n];
return 0;
}

最新文章

  1. 转:Delphi2010新发现-类的构造和析构函数功能
  2. .NET MVC3中扩展一个HtmlHelper方法CheckBoxList
  3. [BZOJ3504][CQOI2014]危桥(最大流)
  4. 转载 模板整理 by gc812
  5. 在CSV文件中增加一列属性值
  6. &lt;System.ServiceModel&gt;
  7. 电脑问题交流QQ群
  8. 浅谈HashMap的内部实现
  9. VR全景加盟、720全景、VR全景技术平台-全国招商模式疯狂开始
  10. Keil中搭建自动化单元测试框架Unity
  11. ReactJs和React Native的那些事
  12. noip2012
  13. Oracle ERP Audit Funtion in R12.2.4
  14. Keras模型的导出和pb文件的转换
  15. 深入出不来nodejs源码-内置模块引入初探
  16. 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比
  17. SSH版最大会话连接数
  18. maven:新建的maven工程需要添加一下插件
  19. leetcode - 3、Longest Substring Without Repeating Characters
  20. CSS 笔记——选择器

热门文章

  1. 一文彻底弄懂this关键字用法
  2. win7上帝模式详解
  3. Hopper Disassembler系列之Sublime Text 3 爆破
  4. react + layui 坑总结
  5. GoLang设计模式04 - 单例模式
  6. noip模拟48
  7. 20210501 序列,熟练剖分(tree),建造游乐园(play)
  8. javascript(2)运算符
  9. 富文本编辑器-SpringBoot
  10. CodeForce-813B The Golden Age(数学+枚举)