社区讨论
求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 条回复,欢迎继续交流。
正在加载回复...