社区讨论

求hack 90pts wrong on #3

P12149 【MX-X11-T3】「蓬莱人形 Round 1」科学参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjua6ta
此快照首次捕获于
2025/11/04 08:37
4 个月前
此快照最后确认于
2025/11/04 08:37
4 个月前
查看原帖
二分答案后,优先队列求答案
CPP
#include <iostream>
#include <queue>
#include <algorithm>
#define int long long
#define maxn 200005
using namespace std;
struct node{
	int b,w;
	bool friend operator<(node a,node b){
		if(a.b==b.b) return a.w>b.w;
		return a.b>b.b;
	}
}b[maxn];
int n,m,a[maxn],cost;
bool vis[maxn];
bool check(int p){
	int cnt=0;
	int j=m;
	for(int i=1;i<=m;i++) vis[i]=0;
	for(int i=n;i>=1;i--,j--){
		if(a[i]>p) break;
		while(j>0&&b[j].b<a[i]) j--;
		if(j>0) cnt++,vis[j]=1;
		else break;
	}
	j=1;
	for(int i=1;i<=n;i++){
		while(j<=m&&vis[j]) j++;
		if(max((a[i]+1)/2,a[i]-b[j].b)>=p){
			if(cnt) cnt--;
			else return 1;
		}
		else if(j<=m) j++;
	}
	return 0;
}
priority_queue<int,vector<int>,greater<int>>q;
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int l,r;
    l=r=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i],r=max(a[i]+1,r);
    for(int i=1;i<=m;i++) cin>>b[i].b>>b[i].w;
    sort(a+1,a+n+1);sort(b+1,b+m+1);
    reverse(a+1,a+n+1);
    l=r/2;
	while(l!=r-1){
    	int mid=l+r>>1;
    	if(check(mid)) l=mid;
    	else r=mid;
	}
	int cnt=0;
	int j=m;
	for(int i=1;i<=m;i++) vis[i]=0;
	for(int i=n;i>=1;i--,j--){
		if(a[i]>l) break;
		while(j>0&&b[j].b<a[i]) j--;
		if(j>0) cnt++,vis[j]=1,q.push(b[j].w);
		else break;
	}
	r=0;
	for(int i=1;i<=n;i++){
		if(a[i]<=l) break;
		while(r+1<=m&&max((a[i]+1)/2,a[i]-b[r+1].b)<=l){
			r++;
			if(vis[r]==0) q.push(b[r].w);
		}
		cost+=q.top();
		q.pop();
	}
	cout<<l<<" "<<cost;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...