大佬们都怎么做的这题
  • 板块P9519 pay
  • 楼主262620zzj
  • 当前回复21
  • 已保存回复21
  • 发布时间2023/8/12 21:23
  • 上次更新2023/11/3 04:11:51
查看原帖
大佬们都怎么做的这题
575698
262620zzj楼主2023/8/12 21:23

我二分加一个递推勉强过去

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
#include<string>
#include<time.h>
using namespace std;
typedef long long ll;
const int N=1000005;
int n,m;
ll a[N],b[N],c[N],d1[N],d2[N],e1[N],e2[N];
ll l,r=1145141919810,mid,tmp,k;
bool check(ll k){
	for(int i=1;i<=n;i++){
		e1[i]=e1[i-1]-d1[i-1]+d1[max((ll)0,i-k-1)];
		if(c[i])e1[i]+=k;
	}
	for(int i=n;i>=0;i--){
		e2[i]=e2[i+1]-d2[i+1]+d2[min((ll)n+1,i+k+1)];
		if(c[i])e2[i]+=k;
		tmp=e1[i]+e2[i];
		if(c[i])tmp-=k;
		if(tmp<a[i])return 0;
	}
	return 1;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d",&b[i]);
		c[b[i]]=1;
	}
	for(int i=1;i<=n;i++)d1[i]=d1[i-1]+c[i];
	for(int i=n;i>=0;i--)d2[i]=d2[i+1]+c[i];
	while(l<r){
		mid=l+r>>1;
		if(check(mid))r=mid;
		else l=mid+1;
	}
	printf("%lld",l);
	return 0;
}
2023/8/12 21:23
加载中...