WA90求调
  • 板块P9519 pay
  • 楼主Expert_Dream
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/8/13 08:54
  • 上次更新2023/11/3 04:09:56
查看原帖
WA90求调
768530
Expert_Dream楼主2023/8/13 08:54
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[1000005];
int b[1000005];
int c[1000005];
bool check(int k){
	memset(c,0,sizeof c);
//	long long res;
	priority_queue<int> que;
	int x=0,y=0;
	int j=1;
//	cout<<"-----";
	for(int i = 1;i <= n;i++){
		if(b[j] == i){
			x += k;
			j++;
			que.push(-(i+k));
		}while(!que.empty() && (-que.top()) < i){
			que.pop();
			y--;
		}
		x-=y;
		c[i] += x;
//		cout<<x<<" ";
//		cout<<y<<" ";
		if(b[j-1]==i) y++;
	}
//	cout<<"\n";
	j=m;
	x=0;
	y=0;
//	cout<<"----";
	
	priority_queue<int> q2;
	for(int i = n;i >= 1;i--){
		if(b[j] == i){
			x += k;
//			y++;
			j--;
			q2.push((i-k));
		}while(!q2.empty() && (q2.top()) > i){
			q2.pop();
			y--;
		}
		x-=y;
		c[i]+=x;
//		cout<<x<<" ";
		if(b[j+1] == i) y++;
	}
//	cout<<"\n";
	for(int i =1;i <= m;i++){
		c[b[i]] -= k;
	}
//	for(int i = 1;i <= n;i++){
//		cout<<c[i]<<" ";
//	}cout<<endl;
	for(int i = 1;i<=n;i++){
		if(c[i] < a[i]) {return false;}
	}
	return true;
}
signed main(){
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		scanf("%lld",&a[i]);
	}for(int i = 1;i <= m;i++){
		scanf("%lld",&b[i]);
	}sort(b+1,b+1+m);
	int l=0,r=1e9,mid;
	while(l < r){
		mid = (l + r) >> 1;
		if(check(mid)){
			r = mid;
		}else{
			l = mid+1;
		}
//		cout<<l<<"\n";
	}
	
	cout<<l;

//	cout<<"=----"<<check(2);
	return 0;
}

正序枚举遍历每一个点的贡献 倒序也来一次 在容斥原理去掉本身一次

进行二分

2023/8/13 08:54
加载中...