首页 > 其他分享 >P2900 [USACO08MAR] Land Acquisition G

P2900 [USACO08MAR] Land Acquisition G

时间:2024-07-29 22:42:41浏览次数:7  
标签:Node maxx Land return int clac P2900 Acquisition hd

P2900 [USACO08MAR] Land Acquisition G

传送门

思路:

先将土地按照长\(H\)排序
从后往前遍历如果有出现\(H[i] \le H[j]\ \text{and}\ W[i] \le W[j]\)则这块土地是没有贡献的(\(i\)与\(j\)拼单)
处理完之后H从小到大有序, W从大到小有序
方程:
\(f[i] = f[j - 1] + max(h[k]) * max(w[k]) (k∈[j, i])\)
等价于
\(f[i] = f[j - 1] + h[i] * w[j];\)
将式子变成
\(f[j - 1] = -h[i] * w[j] + f[i];\)
\(y = k x + b\)
\(f[j - 1]\) 表示 \(y\)
$-h[i] $表示 \(k\)(斜率)
\(w[j]\)表示\(x\)
\(f[i]\)表示\(b\)

解题步骤:

  1. 算出\(x, y\)
  2. 用单调队列维护下凸包
    拿队尾两个元素组成线段的斜率与\(i\)和队尾的元素组成的线段的斜率比较
    如果\(i\)和队尾的元素组成的线段的斜率大,则出队
bool check(int i, int j, int k) // i是最右边的点,j是队列倒数第二个点,k是队尾
{
    return (y[k] - y[j]) * (x[i] - x[k]) <= (y[i] - y[k]) * (x[k] - x[j]);
}
  1. 入队
  2. 比较队首元素和队首第二个元素分别与 \(i\)算出的值进行比较
    若队首元素算出的值不优于队首第二个元素的值,则出队
while (hd < tl && clac(i, q[hd]) >= clac(i, q[hd + 1]))
    ++hd;
  1. 算出\(\text{dp}\)的值

代码:

无优化\(\text{dp}\):

#include <bits/stdc++.h>
#define int long long
#define PII pair<int, int>
using namespace std;
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7, N = 5e4 + 5;
int n, f[N], vis[N], len;

struct Node
{
    int h, w;
    friend bool operator< (Node x, Node y)
    {
        if (x.h != y.h) return x.h < y.h;
        return x.w > y.w;
    }
}a[N], b[N];

signed main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%lld%lld", &a[i].h, &a[i].w);
    sort(a + 1, a + 1 + n);
    int maxx = 0;
    for (int i = n; i >= 1; --i)
    {
        if (maxx >= a[i].w) vis[i] = 1;
        maxx = max(maxx, a[i].w);
    }
    for (int i = 1; i <= n; ++i)
        if (!vis[i]) b[++len] = a[i];
    memset(f, 0x3f, sizeof f);
    f[0] = 0;
    for (int i = 1; i <= len; ++i)
        for (int j = 0; j < i; ++j)
            f[i] = min(f[i], f[j] + b[i].h * b[j + 1].w);
    printf("%lld", f[len]);
    return 0;
}

正解:

#include <bits/stdc++.h>
#define int long long
#define PII pair<int, int>
using namespace std;
const int inf = 0x3f3f3f3f;
const int MOD = 1e9 + 7, N = 5e4 + 5;
int n, m, f[N], vis[N], q[N], hd, tl, x[N], y[N];

struct Node
{
    int h, w;
    friend bool operator< (Node x, Node y)
    {
        if (x.h != y.h) return x.h < y.h;
        return x.w > y.w;
    }
}a[N], b[N];

int clac(int i, int j)
{ return f[j - 1] + b[i].h * b[j].w; }

bool check(int i, int j, int k)
{ return (y[k] - y[j]) * (x[i] - x[k]) <= (y[i] - y[k]) * (x[k] - x[j]); }

signed main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%lld%lld", &a[i].h, &a[i].w);
    sort(a + 1, a + 1 + n);
    int maxx = 0;
    for (int i = n; i >= 1; --i)
    {
        if (maxx >= a[i].w) vis[i] = 1;
        maxx = max(maxx, a[i].w);
    }
    for (int i = 1; i <= n; ++i)
        if (!vis[i]) b[++m] = a[i];
    memset(f, 0x3f, sizeof f);
    f[0] = 0;
    hd = 1, tl = 0;
    for (int i = 1; i <= m; ++i)
    {
        x[i] = b[i].w, y[i] = f[i - 1];
        while (hd < tl && check(i, q[tl - 1], q[tl])) --tl;
        q[++tl] = i;
        while (hd < tl && clac(i, q[hd]) >= clac(i, q[hd + 1])) ++hd;
        f[i] = clac(i, q[hd]);
    }
    printf("%lld\n", f[m]);
    return 0;
}

标签:Node,maxx,Land,return,int,clac,P2900,Acquisition,hd
From: https://www.cnblogs.com/wanghaoze121126/p/18331194

相关文章

  • ubuntu下goland打开新的项目闪退的解决办法
    安装最新的ubuntu2024.04版本的desktop,安装了goland作go的开发遇到问题,刚从服务器clone的项目,使用goland打开,会闪退,再打开goland,会回到上一次正常打开的项目经过多次测试,发现是无法自动创建.idea目录导致,我复制一个其他项目的.idea的目录进取后,可以正常打开,但相关项目是信息是错......
  • AT_abc363_e [ABC363E] Sinking Land Solution
    题目大意:有一座矩形岛屿,被分为\(H\timesW\)的网格,四周与海水接触,给定时间\(Y\)年,最初海平面位于高度\(0\\text{m}\),每年海水上升\(1\\text{m}\),请求出每年未被海水淹没的格子数(高度小于等于海水高度即为淹没)。显然有点类似于广搜的想法,用一个队列存储与海水接触的方......
  • 如何使用face_recognition库中的face_landmarks
    face_recognition库有face_recognition.face_landmarks()这会在列表中返回许多字典,每个字典都包含像top_lipsright_eye等地标和许多元组。谁能解释一下这些元组是什么,以及我如何使用它们?[{'chin':[(294,215),(295,230),(297,244),(300,258),(304,271),......
  • CF140E New Year Garland
    题意有\(m\)种小球,用这些小球装饰一棵\(n\)层的圣诞树,每层需要放置\(a_i\)个小球。在每一层中,相邻球颜色不同,且相邻两层球颜色集合不同,求装饰圣诞树的方案数,答案对\(p\)取模。\(1\len,m\le10^6,2\lep\le10^9,1\lea_i\le5000,\sum_{i=1}^na_i\le10^7\qquad\tex......
  • ABC 363 E - Sinking Land 题解
    用一个优先队列维护和海相邻的位置,每次海面上升就判断一下队列中海拔最低的那个位置会不会被淹没,如果会,就删除,同时它上下左右的位置也是和海相邻的(或者就在海里),把它们加进优先队列里,记得判断一下加入的格子曾经有没有被加入过队列,不要加重复了。点击开DconstintN=1099;int......
  • GoLand 2024 for Mac GO语言集成开发工具环境
    Mac分享吧文章目录效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文稿】。将安装包内的【ja-netfilter】文件夹拖到文稿中4、填写内容,修改用......
  • joi2022_yo2_c 国土分割 (Land Division) 题解
    国土分割(LandDivision)推销我的洛谷博客。题意给定一个\(n\timesm\)的矩阵\(a\),你需要选择在横向或纵向分割至少一次,使得每个分割出来的小矩阵的\(a_{i,j}\)之和相等。数据范围\(1\leqslantn,m\leqslant50\)。\(1\leqslanta_{i,j}\leqslant10^5\)。思......
  • Land survey boundary report (template)
    Landsurveyboundaryreport(template) 土地勘测定界报告(模板).doc......
  • 解决Landsat 5 TM L2影像在ENVI中打不开的情况
    打开Landsat5TML2影像的MTL文件在ENVI中报错如下:解决方法:打开MTL文件更改两个地方:1.将第一行改为:GROUP=L1_METADATA_FILE;2.L2级的影像已经过校正处理,正确的应该是如下图所示*****_SR_B*.TIF,但是在MTL里面往下拉还有一处地方的各波段名称没有更改过来,将下图红色框内......
  • GEE APP:根据大地遥感Landsat卫星 5 号、7 号和 8 号估算河流排放量
    摘要河流排量卫星遥感(RSQ)算法为补充河流测量记录提供了有用的观测数据源。RSQ算法已经存在了十多年,但由于缺乏可操作性和对不确定性的定量描述,其广泛使用一直受到阻碍。在此,我们介绍一种利用大地遥感卫星观测数据近实时估算河流排放量的算法RODEO。RODEO已通过456个测站(......