麻烦的聚餐/拦截导弹加强版 dp优化nlogn

这俩感觉都是最长上升/下降子序列的问题…用二分查找优化
当成一个模板背好了(
这道题是直接copy了拦截导弹的代码改了改
放到了麻烦的聚餐上用的(

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 100010;
int dp[N];
int a[N];
int dp2[N];

int main() {
	int n;
	cin >> n;
	//for (int i = 1; i <= n; i++)cin >> a[i];
	int res = -1;
	int res2 = 0;
	dp[0] = 0x3f3f3f;
	dp2[0] = -1;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		dp[i] = 0x3f3f3f;
		dp2[i] = -1;
	}
	//for (int i = 1; i <= n; i++)cout << a[i] << " ";
	int idx = 0;
	for (int i = 1; i <= n; i++) {
		if (a[i] <= dp[idx])dp[++idx] = a[i];//如果能拦截
		else {//看看前面的能不能有 如果没有那就往后+
			int l = 1, r = idx;
			while (l < r) {
				int mid = l + r >> 1;
				if (a[i] > dp[mid])r = mid;
				else l = mid + 1;
			}
			dp[l] = a[i];
		}
	}
	res = max(res, idx);
	idx = 0;
	for (int i = 1; i <= n; i++) {
		if (a[i] > dp2[idx])dp2[++idx] = a[i];
		else {
			int l = 1, r = idx;
			while (l < r) {
				int mid = l + r >> 1;
				if (dp2[mid] >= a[i])r = mid;
				else l = mid + 1;
			}
			dp2[l] = a[i];
		}
	}
	res = max(res, idx);
	cout << n-res;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值