题解:P2672 [NOIP2015 普及组] 推销员
题目大概是要求这个东西:给定
最大。
Sub1
直接爆搜即可,复杂度
Sub2
不难想到定义一个 dp,令
时间复杂度
Sub3
从网上看到个比较奇怪的
具体可以自己去那篇 blog 去看。
Sub4
正解,Sub3 的奇怪做法提醒了我们「贪心地增加一个最优的用户」。
做这个题之前应该会想到一个乱搞结论:直接选
但是动动脑子就会发现这肯定是错的,比如我可以构造一组数据让前
但是我们灵机一动,从上面那段话以及最开始那个式子可以注意到,答案只与我们选的最大的一个
所以我们想到,既然
且
最大。
所以我们可以按
但是我用我两百万年前写的 code 交上去发现被 hack 了,原因是我们最开始可能乱猜的结论有那么一点道理(说人话就是上面的做法会漏掉一些情况),为了完善一些可能会错误的情况,我们需要和我们乱猜的结论取
#include <bits/stdc++.h>
#define FASTIO ios::sync_with_stdio(0), cin.tie(nullptr), cout.tie(nullptr);
#define rep(i, j, k) for(int i = j; i <= k; ++i)
#define pre(i, j, k) for(int i = j; i >= k; --i)
#define pb push_back
#define PII pair<int, int>
#define fi first
#define se second
#define int long long
#define inf LONG_LONG_MAX
#define repx(i, x) for(int i = head[x]; i; i = nxt[i])
using namespace std;
const int N = 1e5 + 5;
const int mod = 1e9 + 7;
int n, m, pre[N], mx[N], suf[N];
struct node {
int x, c;
#define x(p) t[p].x
#define c(p) t[p].c
bool operator < (const node &a) const {return c > a.c;
}
} t[N];
signed main() {
FASTIO
cin >> n;
rep(i, 1, n) cin >> x(i);
rep(i, 1, n) cin >> c(i);
sort(t + 1, t + 1 + n);
rep(i, 1, n) pre[i] = pre[i - 1] + c(i), mx[i] = max(mx[i - 1], x(i));//情况1
pre(i, n, 1) suf[i] = max(suf[i + 1], x(i) * 2 + c(i));//情况2
rep(i, 1, n) cout << max(pre[i] + 2 * mx[i], pre[i - 1] + suf[i]) << '\n';
return 0;
}