其他分享
首页 > 其他分享> > 题解 P7514 【[省选联考 2021 A/B 卷] 卡牌游戏】

题解 P7514 【[省选联考 2021 A/B 卷] 卡牌游戏】

作者:互联网

[省选联考 2021 A/B 卷] 卡牌游戏

题目大意:

有 \(n\) 张卡牌,可以将至多 \(m\) 张卡牌翻面,求最后卡牌极差的最小值。

solution:

首先我想到二分答案:考虑 \(check\) 一个极差 \(x\) :

细节处理:

由于翻的一定是前缀后缀,可以用一个数组来存前后缀 \(\text{RMQ}\) 。刚开始我用了 \(\text{ST}\) 表但是 \(\text{T}\) 了三个点。

看到这的同学,可以自己去写代码了(tf口吻)

代码
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
template <class T>
inline T Max(const T x,const T y){return x>y?x:y;}
template <class T>
inline T Min(const T x,const T y){return x<y?x:y;}
const int N=1e6+5;
int n,m; 
int a[N],b[N];
int pmax[N],pmin[N],smax[N],smin[N];
inline void RMQ(){
	pmax[0]=0,pmin[0]=0x7fffffff;
	for(int i=1;i<=n;i++)
		pmax[i]=Max(b[i],pmax[i-1]),pmin[i]=Min(b[i],pmin[i-1]);
	smax[n+1]=0,smin[n+1]=0x7fffffff;
	for(int i=n;i>=1;i--)
		smax[i]=Max(b[i],smax[i+1]),smin[i]=Min(b[i],smin[i+1]);
}
inline int ef1(int l,int r,int x){
	while(l<r){
		int mid=l+r+1>>1;
		if(a[mid]>x) r=mid-1;
		else		 l=mid;
	}
	return r;
}
inline int ef2(int l,int r,int x){
	while(l<r){
		int mid=l+r>>1;
		if(a[mid]>=x) r=mid;
		else	      l=mid+1;
	}
	return r;
}
inline bool check(int x){
	for(int l=1,r;l<=n;l++){
		r=ef1(l,n,x+a[l]);
		if(n-(r-l+1)>m) continue;
		if(Min(pmin[l-1],smin[r+1])>=a[l]&&Max(pmax[l-1],smax[r+1])<=a[l]+x)
		 	return 1;
	}
	for(int r=1,l;r<=n;r++){
		l=ef2(1,r,a[r]-x);
		if(n-(r-l+1)>m) continue;
		if(Min(pmin[l-1],smin[r+1])>=a[r]-x&&Max(pmax[l-1],smax[r+1])<=a[r])
		 	return 1;
	}
	return 0;
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]);
	RMQ();
	int l=0,r=a[n]-a[1],ans;
	while(l<=r){
		int mid=l+r>>1;
		if(check(mid)) ans=mid,r=mid-1;
		else           l=mid+1;
	}
	printf("%d",ans);
	return 0;
}

证明一下

如下图:

我们把选好的中间一段反转:


若不出现翻转区间中 \(b[\,i\,]>a[\,n\,]\) 或者 \(b[\,i\,]<a[\,1\,]\) 的情况,易证不会对极差造成影响。

若出现上述情况,不妨设 \(b[\,j2\,]<a[\,1\,]\) ,此时极差为 \(a[\,n\,]-b[\,j2\,]\),该值一定大于 \(a[\,n\,]-a[\,1\,]\) ,不会作为最小值 。

根据上述结论,\(b[\,j1\,]>a[\,n\,]\) 时也不会出现更小的极差。

证毕

End

标签:P7514,return,int,题解,mid,卡牌,翻面,inline,联考
来源: https://www.cnblogs.com/TSZ-think/p/15076781.html