社区讨论
是我算法假了吗?
AT_abc348_g[ABC348G] Max (Sum - Max)参与者 3已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lup8wr8j
- 此快照首次捕获于
- 2024/04/07 16:12 2 年前
- 此快照最后确认于
- 2024/04/07 19:05 2 年前
我的思路如下:
考虑以 为关键字从小到大排序,然后显然假如我们加入 那么。
-
成为最大值,答案增加
-
不是最大值,答案白嫖一个
那么对于我们当前答案的最大值然后将小于 的还没选的值用堆维护,大于 还没选的值用堆维护,然后动态删除,加入统计即可。
看了同学的代码,他们都不是这样写的,所以是我代码有BUG 还是思路本身有问题?
样例全过
CPP#include<bits/stdc++.h>
using namespace std;
struct node{
int a;
long long b;
}p[200005];
bool cmp(node x,node y){
if(x.b==y.b)return x.a>y.a;
return x.b<y.b;
}
int n,ind,cnt;
long long maxb,ans;
priority_queue<pair<long long,int> >q1;
priority_queue<pair<long long,int> >q2;
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>p[i].a>>p[i].b;
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++){
q2.push(make_pair(p[i].a-p[i].b,i));
}
maxb=0;
ind=1;
while(cnt<n){
pair<long long,int>l;
if(!q1.empty())l=q1.top();
else l.first=-1e18;
pair<long long,int>r;
while(!q2.empty()&&q2.top().second<ind)q2.pop();
if(!q2.empty())r=q2.top();
else r.first=-1e18;
if(r.first+maxb>=l.first){
ans+=maxb+r.first;
maxb=p[r.second].b;
q2.pop();
while(ind<r.second){
q1.push(make_pair(p[ind].a,ind));
ind++;
}
ind++;
}else{
ans+=l.first;
q1.pop();
}
cout<<ans<<endl;
cnt++;
}
}
*/
回复
共 7 条回复,欢迎继续交流。
正在加载回复...