嘟嘟嘟

只要会决策单调性,这题就是练手的

首先按矩形长排序,这样只用考虑宽了。
然后很容易搞出dp方程
\[dp[i] = min _ {j = 0} ^ {i - 1} (dp[j] + x[i] * max_{k = j + 1} ^ {i} y[k])\]
找max可以用st表达到\(O(1)\)。
打表发现决策单调。然后就是正常的优化了。
二分的时候需要注意当前队列非空。要不然会像我一样,不开氧气AC,开了RE2个点。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define rg register
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 5e4 + 5;
inline ll read()
{ll ans = 0;char ch = getchar(), last = ' ';while(!isdigit(ch)) last = ch, ch = getchar();while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();if(last == '-') ans = -ans;return ans;
}
inline void write(ll x)
{if(x < 0) x = -x, putchar('-');if(x >= 10) write(x / 10);putchar(x % 10 + '0');
}int n;
ll dp[maxn];
struct Node
{ll x, y;bool operator < (const Node& oth)const{return x < oth.x || (x == oth.x && y < oth.y);}
}t[maxn];
struct Node2
{int pos, L, R;
}q[maxn];
int l = 1, r = 0;ll Max[20][maxn], b[maxn];
void init()
{for(int i = 1; i <= n; ++i) Max[0][i] = t[i].y;for(int j = 1; (1 << j) <= n; ++j)for(int i = 1; i + (1 << j) - 1 <= n; ++i)Max[j][i] = max(Max[j - 1][i], Max[j - 1][i + (1 << (j - 1))]);int x = 0;for(int i = 1; i <= n; ++i){if((1 << (x + 1)) <= i) x++;b[i] = x;}
}
ll query(int L, int R)
{int k = b[R - L + 1];return max(Max[k][L], Max[k][R - (1 << k) + 1]);
}ll w(int L, int R)
{return query(L, R) * t[R].x;
}int solve(int x, Node2 a)
{int L = a.L, R = a.R;while(L <= R){int mid = (L + R) >> 1;if(dp[x] + w(x + 1, mid) <= dp[a.pos] + w(a.pos + 1, mid)){if(R != mid) R = mid;else {L = mid; break;}}else{if(L != mid + 1) L = mid + 1;else break;}}return L;
}int main()
{n = read();for(int i = 1; i <= n; ++i) t[i].x = read(), t[i].y = read();sort(t + 1, t + n + 1);init();q[++r] = (Node2){0, 1, n};for(int i = 1; i <= n; ++i){while(q[l].R < i) l++;dp[i] = dp[q[l].pos] + w(q[l].pos + 1, i);q[l].L = i + 1;while(l <= r && dp[i] + w(i + 1, q[r].L) <= dp[q[r].pos] + w(q[r].pos + 1, q[r].L)) r--;int pos = i;if(l <= r) pos = solve(i, q[r]), q[r].R = pos - 1;if(pos <= n) q[++r] = (Node2){i, pos, n};}write(dp[n]), enter;return 0;
}

转载于:https://www.cnblogs.com/mrclr/p/10122853.html

[USACO08MAR]Land Acquisition相关推荐

  1. P2900 [USACO08MAR]土地征用Land Acquisition(斜率优化)

    题目描述 Farmer John is considering buying more land for the farm and has his eye on N (1 <= N <= ...

  2. [USACO08MAR]土地征用Land Acquisition

    题面在这里 题意 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地. 如果约翰单买一块土地,价格就是土地的面积,但他可以选择并购一组土地, 并购的价格为这些土地中最大的长乘以最大的宽. 给定每 ...

  3. 非导向传输媒体| 计算机网络

    Transmission media can be categorized in two ways, 传输媒体可以通过两种方式进行分类: Guided Transmission Media 引导传输媒 ...

  4. 『摆渡车 斜率优化dp及总结』

    摆渡车的题解我已经写过一遍了,在这里,这次主要从斜率优化的角度讲一下摆渡车,并总结一下斜率优化会出现的一些奇奇怪怪的错误. 摆渡车 Description 有 n 名同学要乘坐摆渡车从人大附中前往人民 ...

  5. 【论文阅读】Automatic Updating of Land Cover Maps in Rapidly Urbanizing Region

    文章名称: Automatic Updating of Land Cover Maps in Rapidly Urbanizing Regions by Relational Knowledge Tr ...

  6. Google Earth Engine ——GCOM-C 进行长期和持续的全球陆地地表温度数据集(JAXA/GCOM-C/L3/LAND/LST/V1)

    本产品是陆地表面的温度. 更新版本的 JAXA/GCOM-C/L3/LAND/LST/V2也可用于此数据集,该数据集使用此算法进行处理. GCOM-C 进行长期和持续的全球观测和数据收集,以阐明辐射收 ...

  7. Google Earth Engine ——GCOM-C 进行长期和持续的陆地地表温度数据集(JAXA/GCOM-C/L3/LAND/LAI/V2)

    本产品是陆地表面的温度. 更新版本的 JAXA/GCOM-C/L3/LAND/LST/V2也可用于此数据集,该数据集使用此算法进行处理. GCOM-C 进行长期和持续的全球观测和数据收集,以阐明辐射收 ...

  8. Google Earth Engine ——GCOM-C 进行长期和持续的全球叶面积指数数据集(JAXA/GCOM-C/L3/LAND/LAI/V2)

    此乘积为单位地面面积的单面绿叶面积之和.这是一个持续的数据集,延迟为 3-4 天,目前只有 2020 年的数据可用.供应商已经发布了重新处理整个积压工作的时间表.GCOM-C 进行长期和持续的全球观测 ...

  9. 洛谷P2904 [USACO08MAR]跨河River Crossing 动态规划

    洛谷P2904 [USACO08MAR]跨河River Crossing 动态规划 区间DP f[ i ] 表示 将 i 头牛 运了过去,然后John 又返回所需要的最少时间 1 #include & ...

  10. 第二周 数据获取与表示 第一节 数据获取 Data Acquisition

    2.1 Data Acquisition 一.本地数据获取 Local Data Acquisition:打开后才能进行读写:读文件.写文件:文件处理完毕要关闭文件(因为Python回缓存写入数据,若 ...

最新文章

  1. Web APi之消息处理管道(五)
  2. linux系统管理学习笔记之三----软件的安装
  3. 单元测试instrumentation入门---eclipse
  4. C语言位、字节、半字、字的概念和内存位宽
  5. 监听 html dom 变化,如何监听页面 DOM 变动并高效响应
  6. python实现人脸识别_python人脸识别代码实现丨内附代码
  7. android高级资料
  8. svn linux版本下载,linux 下安装 subversion(svn) 客户端
  9. js 父子标签同时设置onclick,字标签触发父标签onclick解决办法
  10. 树莓派4B安装ffmpeg的方法
  11. OpenCV.js 快速入门指南
  12. android 系统GPS模块
  13. 一款针对中小型酒店设计的管理系统,源码分享
  14. hp电脑测试软件,HP惠普笔记本电池检测工具Battery Check V4.1.0.2中文官方版
  15. andorid studio 无法识别app项目解决
  16. 流程图制作软件绘图技巧:快速学会怎么画流程图
  17. dimens文件生成器
  18. LESS与SASS的伯与仲
  19. 洛谷 P1007独木桥 C语言
  20. 右键新增文件/文件夹-打开方式

热门文章

  1. 管理新语:说说工作的主动权
  2. dpkg: 错误: 另外一个进程已经为 dpkg frontend lock 加锁
  3. LINUX编译:通过prefix把编译结果输出到指定位置
  4. LINUX也有C#?
  5. 南昌项目中镜像系统时遇到的问题
  6. 也谈谈古代一两银子相当于今天的价格
  7. 管理感悟:掌握工作的决定权
  8. ubuntu无法打开系统设置的解决办法
  9. 计算机的创新产品,这几种电脑创新功能 空有喝彩没人买
  10. linux ssl 脚本 51cto,升级opensslopenssh的shell脚本