Div.2 D 求助
  • 板块学术版
  • 楼主Unnamed114514
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/4/21 00:35
  • 上次更新2023/10/23 17:56:29
查看原帖
Div.2 D 求助
556362
Unnamed114514楼主2023/4/21 00:35
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+5,inf=9e18;
int T,n,k,l[maxn],r[maxn];
multiset<int> s;
signed main(){
	scanf("%lld",&T);
	while(T--){
		scanf("%lld%lld",&n,&k);
		for(int i=1;i<=n;++i)
			scanf("%lld",&l[i]);
		for(int i=1;i<=n;++i)
			scanf("%lld",&r[i]);
		int ans=inf,sum=0,len=0;
		s.clear();
		for(int i=1;i<=n;++i)
			if(sum+(r[i]-l[i]+1)<k){
				s.insert(r[i]-l[i]+1),++len;
				sum+=(r[i]-l[i]+1);
			} else{
				if(len&&sum>=k&&(*s.begin())>=(r[i]-l[i]+1)){
					ans=min(ans,len*2+l[i]+k-sum-1);
					continue;
				}
				while(len&&(*s.begin())<(r[i]-l[i]+1)&&sum+(r[i]-l[i]+1)-(*s.begin())>=k){
					sum-=(*s.begin());
					s.erase(s.begin()),--len;
				}
				s.insert(r[i]-l[i]+1),++len;
				ans=min(ans,len*2+l[i]+k-sum-1);
				sum+=(r[i]-l[i]+1);
			}
		if(ans==inf)
			puts("-1");
		else
			printf("%lld\n",ans);
	}
	return 0;
}
2023/4/21 00:35
加载中...