F - Hammer 2

news/2025/3/29 8:13:17/

F - Hammer 2(ABC273f)

题意

高桥是数轴的起源。高桥想在坐标达到目标X.

此外,还有n墙壁和n锤在数轴上。

在坐标是
Y1…Yn

是类型的墙1…n分别。
最初,高桥无法翻墙。
在坐标Z1…Zn
​​​
是类型的锤子1 、2 、…,n,分别。
当他用锤子到达一个坐标时,他得到了锤子。
锤子致力于破坏类型相同的墙. 在他得到锤子i之后,他可以摧毁墙i。
确定他能否达到目标。如果可以,找出他​​行进的最短距离。

样例

输入
3 10
-2 8 -5
5 -10 3
输出
40

解法 一 dp

一共有2 * n + 2个点(原点, x, 2 * n), 排序,记录位置
dp[i][j][0/1] 表示走过从i 到 j, 当前在i, 或 j 的最小代价
转移从(i, j, 0/1) 到(i - 1, j, 0) 和(i, j + 1, 1) , 再加上距离就行了。
时间O(n2 * 4) 空间同理

#include <bits/stdc++.h>
#define fi first 
#define se second
using namespace std;
const int maxn = 4e3 + 10; 
typedef long long ll;
typedef pair<int, int> pii;
int n, x;
int p0, px;
int a[maxn], b[maxn];
pii c[maxn];
ll fL[maxn][maxn], fR[maxn][maxn];
ll ans = 1e18;
int py[maxn], pz[maxn];
signed main() {cin >> n >> x;for (int i = 0; i < n; i++) {cin >> a[i];}vector<pii> v;v.push_back({0, n});v.push_back({x, n + 1}); for (int i = 0; i < n; i++) {cin >> b[i];v.push_back({a[i], i});v.push_back({b[i], ~i});}int sz = (int)v.size();sort(v.begin(), v.end());for (int i = 0; i < v.size(); i++) {if (v[i].se >= 0 && v[i].se < n) py[v[i].se] = i;else if (v[i].se < 0) pz[~v[i].se] = i;if (v[i].se == n + 1) px = i;if (v[i].se == n) p0 = i; }for (int i = 0; i < 4000; i++) for (int j = 0; j < 4000; j++) fL[i][j] = fR[i][j] = 1e18;fL[p0][p0] = 0;fR[p0][p0] = 0;for (int i = p0; i >= 0; i--) {for (int j = p0; j < sz; j++) {if (i <= px && j >= px) {ans = min(ans, fL[i][j]);ans = min(ans, fR[i][j]);}if (i > 0) {int ok = 1;int id = v[i - 1].second;if (id >= 0 && id < n) if (pz[id] < i || pz[id] > j) ok = 0;if (ok) fL[i - 1][j] = min(fL[i - 1][j], fL[i][j] + abs(v[i].fi - v[i - 1].fi)),fL[i - 1][j] = min(fL[i - 1][j], fR[i][j] + abs(v[j].fi - v[i - 1].fi));}if (j < sz - 1) {int ok = 1;int id = v[j + 1].second;if (id >= 0 && id < n) if (pz[id] < i || pz[id] > j) ok = 0;if (ok) fR[i][j + 1] = min(fR[i][j + 1], fL[i][j] + abs(v[i].fi - v[j + 1].fi)),fR[i][j + 1] = min(fR[i][j + 1], fR[i][j] + abs(v[j].fi - v[j + 1].fi));}  }}if (ans < 1e18) cout << ans << endl;else cout << -1 << endl;return 0;
}

解法2 模拟+贪心O(nlogn)7ms

#include <bits/stdc++.h>
#define fi first 
#define se second
using namespace std;
const int maxn = 4e3 + 10; 
typedef long long ll;
typedef pair<int, int> pii;
int n, x;
int a[maxn], b[maxn];
int sl[maxn], sr[maxn];
int l = -1e9, r = 1e9;
signed main() {ios::sync_with_stdio(false);cin.tie(0);cin >> n >> x;for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n; i++) cin >> b[i];vector<pii> li, ri;for (int i = 0; i < n; i++) {if (a[i] < 0 && b[i] < 0 || a[i] > 0 && b[i] > 0) {if (abs(a[i]) < abs(b[i])) {if (a[i] > 0) r = min(r, a[i]);else l = max(l, a[i]);}} else {if (a[i] > 0) ri.push_back({a[i], i});else li.push_back({a[i], i});}}sort(li.rbegin(), li.rend());sort(ri.begin(), ri.end());if (l > x || r < x) {cout << -1 << endl;return 0;}int mn = 0, mx = 0;for (auto p:ri) sr[p.se] = min(mn, b[p.se]), mn = min(sr[p.se], mn);for (auto p:li) sl[p.se] = max(mx, b[p.se]), mx = max(sl[p.se], mx);int c = x, nc;ll ans = 0;set<int> mp;while(c != 0) {if (mp.count(c)) {cout << -1 << endl;return 0;}mp.insert(c);if (c > 0) {auto it = lower_bound(ri.begin(), ri.end(), make_pair(c, 0));if (it != ri.begin()) {nc = sr[prev(it)->second];} else nc = 0;} else {auto it = upper_bound(li.rbegin(), li.rend(), make_pair(c, 0));if (it != li.rend()) {nc = sl[it->second];} else nc = 0;}ans += abs(c - nc);c = nc;}cout << ans << endl;return 0;
}

http://www.ppmy.cn/news/506401.html

相关文章

hdf4

#include "mfhdf.h" #pragma comment (lib, "mfhdf.lib") // 打开hdf4文件 // > 0 成功 SDstart // 关闭hdf4文件 SDend // 查询相关属性 // > -1 成功,返回索引 SDfindattr // 读取属性定义 // SUCCEED 成功 SDattrinfo // 读取…

hFE和hfe有什么不同?

Mako&#xff1a;我们已经学习了有关晶体管的工作原理,晶体管的放大作用就是由小的 输入得到大的输出吧? Doc:这种说法还稍微有点欠缺,应 该说成用小的输入控制大的输出更为合适。如果只关注晶体管的电流,就 可以这样考虑,用极小的基极电流IB控制 大的集电极电流I。通常,基极电…

FH

主要是接收网页的请求&#xff1a; com.fiberhome.platform.controller HTML&#xff1a;超文本标记语言是一种用于创建网页的标准标记语言。可以使用HTML来建立自己的WEB站点&#xff0c;HTML运行在浏览器上&#xff0c;由浏览器来解析。 &#xff1a;声明为HTML5文档 <…

FHS

FHS文件系统层级结构标准 文件系统&#xff1a;操作系统用于明确存储设备或分区上的文件的方法和数据结构&#xff1b; (磁盘上组织文件的方法 在操作系统中负责管理和存储文件信息的软件机构) linux层次化文件结构&#xff0c;倒树状结构文件结构 FHS filesystem hierarchy s…

Android四大组件之ContentProvider

1.ContentProvider定义 这里通过一个实际的例子来说明ContentProvider&#xff08;内容提供者&#xff09;是什么&#xff0c;作用是什么 短信应用要访问通讯录应用中的数据&#xff0c;是不能直接访问的&#xff0c;应用通讯录的中的数据是属于通讯录app数据库中的数据&…

EventBus

EventBus 文章目录 EventBus1.EventBus的作用2.关于EventBus的概述3.EventBus的使用方法4.EventBus的黏性事件5.EventBus的源码EventBus的构造方法getDefault()源码EventBus()源码 订阅者注册register()源码findSubscriberMethods()源码findUsingInfo()源码findUsingReflection…

在成都

今年是在成都的11年了,这期间我经历了传统生活与成都新媒体的融合发展,也见证了成都媒体的崛起。我从杂志编辑转行到了手机报编辑,再到自媒体运营,这11年里,我赶在青春最前面&#xff0c;各种沧桑。

内存到底分几个区?

1、栈区&#xff08;stack&#xff09;&#xff1a;由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。 2、堆区&#xff08;heap&#xff09;&#xff1a;一般由程序员分配释放&#xff0c; 若程序员不释放&#xff0c;程序结束时可能由os回收 。…