P6877 题解
前言
贪心。内容抄自某校课件。
思路
部分分
这个随便搞都可以,可以二分答案然后建边然后跑二分图最大匹配。
正解
考虑贪心。这里有一个很容易猜到或想到的结论:
将
与 从小到大排序,直接按位配对( 配 ),就是最优解。
设排序后的数组是
然后问题就在于,迅速的维护这个东西了。
这个很简单:维护
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 2e5 + 5;
struct Monkey {int val, id;} a[N];
bool cmp(Monkey p, Monkey q) {return p.val < q.val;}
int b[N], pre[N], suf[N], ans[N]; //pre[i]记录ai-bi前缀mx,suf[i]记录ai+1 - bi后缀mx
int main()
{
ios::sync_with_stdio(false);
int n;
scanf("%d", &n);
for (int i = 1; i <= n + 1; i++) scanf("%d", &a[i].val), a[i].id = i;
for (int i = 1; i <= n; i++) scanf("%d", &b[i]);
sort(a + 1, a + n + 2, cmp), sort(b + 1, b + n + 1);
for (int i = 1; i <= n; i++) pre[i] = max(pre[i - 1], a[i].val - b[i]);
for (int i = n; i; i--) suf[i] = max(suf[i + 1], a[i + 1].val - b[i]);
for (int i = 1; i <= n + 1; i++) ans[a[i].id] = max(pre[i - 1], suf[i]);
for (int i = 1; i <= n + 1; i++) printf("%d ", max(ans[i], 0));
return 0;
}
希望能帮助到大家!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】