斜率优化,有的点WA
  • 板块P6047 丝之割
  • 楼主Lyrella
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/30 12:16
  • 上次更新2023/10/27 13:06:21
查看原帖
斜率优化,有的点WA
576817
Lyrella楼主2022/8/30 12:16
#include <bits/stdc++.h>
#define int long long
#define j q[hd]
using namespace std;
const int N = 3e5 + 5;
int n, m, a[N], b[N], u[N], v[N], la[N], fr[N], q[N], f[N], hd, tl;
struct node{int u, v;}c[N];
bool cmp(node x, node y){return x.u == y.u ? x.v > y.v : x.u < y.u;}
int X(int x){return fr[u[x + 1] - 1];}
int Y(int x){return f[x];}
int K(int x){return la[v[x] + 1];}
double slope(int x, int y){return X(x) == X(y) ? - 1e18 : - 1.0 * (Y(x) - Y(y)) / (X(x) - X(y));}
signed main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i++)scanf("%lld", &a[i]);
	for(int i = 1; i <= n; i++)scanf("%lld", &b[i]);
	for(int i = 1; i <= m; i++)scanf("%lld %lld", &c[i].u, &c[i].v);
	sort(c + 1, c + 1 + m, cmp); int cnt = m; m = 0;
	for(int i = 1, ma = 0; i <= cnt; i++)
	{
		if(c[i].v <= ma)continue;
		u[++m] = c[i].u, ma = v[m] = c[i].v;
	}
	la[n + 1] = 1e18, fr[0] = 1e18, u[0] = 1;
	for(int i = 1; i <= n; i++)fr[i] = min(fr[i - 1], a[i]);
	for(int i = n; ~ i; i--)la[i] = min(la[i + 1], b[i]);
	for(int i = 1; i <= m; i++)
	{
		while(hd < tl and slope(j, q[hd + 1]) > - K(i))hd++;
		f[i] = f[j] + X(j) * K(i);
		while(hd < tl and slope(q[tl - 1], q[tl]) < slope(q[tl], i))tl--;
		q[++tl] = i;
	}
	cout << f[m];
}
2022/8/30 12:16
加载中...