Two Buildings(决策单调性+分治)

2023-10-10 01:40

本文主要是介绍Two Buildings(决策单调性+分治),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
题目大意:
给定一个长度为 n n n 的数组 h h h 求:
m a x ( ( h i + h j ) ( j − i ) ) max(\ (h_i+h_j)(j-i)\ ) max( (hi+hj)(ji) )
题目分析:
此题可转化为求:
m a x ( ( h j − ( − h i ) ) ( j − i ) ) max(\ (h_j-(-h_i))(j-i)\ ) max( (hj(hi))(ji) )
这个就相当于在二维坐标系中求最大矩形的面积,我们设 a , b a,b a,b 数组分别为矩形的左下角和右上角那两个坐标的纵坐标(其横坐标就是其数组下标),则题目所求即为:
m a x ( ( b j − a i ) ( j − i ) ) max(\ (b_j-a_i)(j-i)\ ) max( (bjai)(ji) )
将上式和题目所求联立可得 a i = − h i , b i = h i a_i=-h_i,b_i=h_i ai=hi,bi=hi ,这样我们就可以得到 a , b a,b a,b 数组了
我们继续考虑如何求 m a x ( ( b j − a i ) ( j − i ) ) max(\ (b_j-a_i)(j-i)\ ) max( (bjai)(ji) )
我们发现对于一个给定 a i a_i ai 在选择 b j b_j bj 与之配对时 b j b_j bj 是有决策单调性的:越往右上越优,即对于下面两个决策:
b i ≤ b j ( i < j ) b_i\le b_j(i<j) bibj(i<j)
决策 b j b_j bj 显然优于决策 b i b_i bi 所以可以直接将 b i b_i bi 状态删掉,对 a a a 数组同理(如果不理解在纸上画一画图可能就明白了)
接下来我们考虑如何快速处理出答案:
a , b a,b a,b 数组分别有 n , m n,m n,m 个元素(已按从左下到右上排好序), a . x a.x a.x 表示原数组下标即二维平面的横坐标, a . y a.y a.y 表示二维平面的那个纵坐标, b b b 数组同理
s o l v e ( l 1 , r 1 , l 2 , r 2 ) solve(l1,r1,l2,r2) solve(l1,r1,l2,r2) 表示 a a a 数组下标从 l 1 l1 l1 r 1 r1 r1 b b b 数组从 l 2 l2 l2 r 2 r2 r2 的最优解,我们采用一下过程进行分治:
m i d = l 1 + r 1 2 mid=\frac{l1+r1}2 mid=2l1+r1 我们扫描 b b b 数组并记录对 a m i d a_{mid} amid 的最优解的下标 p o s pos pos ,然后答案就是 a m i d , b p o s a_{mid},b_{pos} amid,bpos 构成的矩形, s o l v e ( l 1 , m i d − 1 , l 2 , p o s ) solve(l1,mid-1,l2,pos) solve(l1,mid1,l2,pos) s o v l e ( m i d + 1 , r 1 , p o s , r 2 ) sovle(mid+1,r1,pos,r2) sovle(mid+1,r1,pos,r2) 三者的最大值(因为决策是具有单调性的)

具体细节见代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<stack>
#define ll long long
#define inf 0x3f3f3f3f
#define Inf 0x3f3f3f3f3f3f3f3f
using namespace std;
ll read()
{ll res = 0,flag = 1;char ch = getchar();while(ch<'0' || ch>'9'){if(ch == '-') flag = -1;ch = getchar();}while(ch>='0' && ch<='9'){res = (res<<3)+(res<<1)+(ch^48);//res*10+ch-'0';ch = getchar();}return res*flag;
}
const int maxn = 5e6+5;
const int mod = 1e9+7;
const double pi = acos(-1);
const double eps = 1e-8;
struct node{ll x,y;bool operator < (const node b) const {if(x == b.x) return y < b.y;return x < b.x;}
}a[maxn],b[maxn];
ll n,m,h[maxn];
bool vis[maxn];
void init_a()
{memset(vis,0,sizeof(vis));sort(a+1,a+n+1);int last = 1,cnt = 0;for(int i = 2;i <= n;i++)if(a[i].y >= a[last].y) vis[i] = true;else last = i;for(int i = 1;i <= n;i++)if(!vis[i]) a[++cnt] = a[i];n = cnt;
}
void init_b()
{memset(vis,0,sizeof(vis));sort(b+1,b+m+1);int last = m,cnt = 0;for(int i = m-1;i;i--)if(b[i].y <= b[last].y) vis[i] = true;else last = i;for(int i = 1;i <= m;i++)if(!vis[i]) b[++cnt] = b[i];m = cnt;
}
ll calc(ll i,ll j)
{if(a[i].x>b[j].x && a[i].y > b[j].y)return -Inf;return (b[j].x-a[i].x)*(b[j].y-a[i].y);
}
ll solve(ll l1,ll r1,ll l2,ll r2)
{if(l1>r1 || l2>r2) return 0;int mid = l1+r1>>1;int pos = l2;for(int i = l2+1;i <= r2;i++)if(calc(mid,pos) < calc(mid,i))pos = i;return max({calc(mid,pos),solve(l1,mid-1,l2,pos),solve(mid+1,r1,pos,r2)});
}
int main()
{n = read();m = n;for(int i = 1;i <= n;i++){h[i] = read();a[i].x = b[i].x = i;a[i].y = -h[i];b[i].y = h[i];}init_a();init_b();printf("%lld\n",solve(1,n,1,m));return 0;
}

这篇关于Two Buildings(决策单调性+分治)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/177024

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

PRN(20201231):驾驶人驾驶决策机制遵循最小作用量原理

王建强, 郑讯佳, 黄荷叶. 驾驶人驾驶决策机制遵循最小作用量原理[J]. 中国公路学报, 2020, v.33;No.200(04):159-172. 观点: 为提升智能汽车的自主决策能力,使其能够学习人的决策智慧以适应复杂多变的道路交通环境,需要揭示驾驶人决策机制。 依据: 物理学中常用最小作用量原理解释自然界(包括物理和生物行为)极值现象。同时,最小作用量原理还用于解释蚂蚁在觅

7. 深度强化学习:智能体的学习与决策

引言 深度强化学习结合了强化学习与深度学习的优势,通过智能体与环境的交互,使得智能体能够学习最优的决策策略。深度强化学习在自动驾驶、游戏AI、机器人控制等领域表现出色,推动了人工智能的快速发展。本篇博文将深入探讨深度强化学习的基本框架、经典算法(如DQN、策略梯度法),以及其在实际应用中的成功案例。 1. 强化学习的基本框架 强化学习是机器学习的一个分支,专注于智能体在与环境的交互过程中,学

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

双指针(5)_单调性_有效三角形的个数

个人主页:C++忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创 双指针(5)_单调性_有效三角形的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习C++的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链接: 2.题目描述 : 3.解法 :     解法一(暴力枚举) :     算法思路 :     代码展示 : 暴力枚

机器学习模型中的因果关系:引入单调约束

单调约束是使机器学习模型可行的关键,但它们仍未被广泛使用欢迎来到雲闪世界。 碳ausality 正在迅速成为每个数据科学家工具包中必不可少的组成部分。 这是有充分理由的。 事实上,因果模型在商业中具有很高的价值,因为它们为“假设”情景提供了更可靠的估计,特别是在用于做出影响业务结果的决策时。 在本文中,我将展示如何通过简单的更改(实际上添加一行代码)将传统的 ML 模型(如随机森林、L

站在 AI 与 Web3 的交汇路口,EraAI 如何带领投资者进入智能化决策时代?

“基于 AI 、区块链等前沿技术,通过与 D3X 等伙伴的深入合作,EraAI 正在以智能化的方式带领投资者们开启“向前看”的全新时代。” 01 二八定律 金融市场并不缺乏投资者,而是缺乏聪明的投资者,事实上,聪明的投资者总能通过深入研究并制定有效的投资策略,把握市场中的关键机会。无论行情如何、无论市场周期如何亦是如此。 早在 1896 年,意大利经济学家 Vilfredo Pa

使用AI大模型进行企业数据分析与决策支持

使用AI大模型进行企业数据分析与决策支持已成为现代企业管理的重要趋势。AI大模型凭借其强大的数据处理能力和智能分析功能,能够为企业提供精准、高效的数据分析服务,进而支持企业的决策过程。以下是使用AI大模型进行企业数据分析与决策支持的具体方式和优势: 一、AI大模型在数据分析中的应用 超级数据处理能力 海量数据处理:AI大模型能够同时处理海量数据,包括结构化数据、非结构化数据等,满足企业大规模