【BZOJ】【P2298】【HAOI2011】【problem a】【题解】【dp+二分】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2298

如果一个人说a个人比他大,b个人比他小,也就是他声称[b+1,,n-a]的值是相等的(好像可以并查集)

问题转化为给一些线段,找出一些线段,价值最大

说起来简单,其实还有各种蛋疼

如果a+b>=n那么直接无视

如果有多个相同的区间,那么价值是min(r-l+1,出现次数)

二分优化dp

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int f[maxn];
int n;
struct pii{
	int x,y,c;
	bool f;
};
pii a[maxn];
bool cmp(pii a,pii b){return a.y<b.y||(a.y==b.y&&a.x<b.x);}
map<pair<int,int>,int>M;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i].x,&a[i].y);
		a[i].f=a[i].x+a[i].y>=n;
		a[i].x=n-a[i].x;
		a[i].y++;
		if(a[i].x>a[i].y)swap(a[i].x,a[i].y);
		a[i].c=min(M[make_pair(a[i].x,a[i].y)]+=a[i].f^1,a[i].y-a[i].x+1);
	}sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		if(a[i].f){f[i]=f[i-1];continue;}
		int l=lower_bound(a+1,a+i,(pii){-1,a[i].x},cmp)-a-1;
		f[i]=max(f[i-1],f[l]+a[i].c);
	}cout<<n-f[n]<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值