社区讨论

是我算法假了吗?

AT_abc348_g[ABC348G] Max (Sum - Max)参与者 3已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@lup8wr8j
此快照首次捕获于
2024/04/07 16:12
2 年前
此快照最后确认于
2024/04/07 19:05
2 年前
查看原帖
我的思路如下:
考虑以 bb 为关键字从小到大排序,然后显然假如我们加入 ii 那么。
  1. bib_i 成为最大值,答案增加 ai+原最大值bia_i+\text{原最大值}-b_i
  2. bib_i 不是最大值,答案白嫖一个 aia_i
那么对于我们当前答案的最大值然后将小于 bib_i 的还没选的值用堆维护,大于 bib_i 还没选的值用堆维护,然后动态删除,加入统计即可。
看了同学的代码,他们都不是这样写的,所以是我代码有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 条回复,欢迎继续交流。

正在加载回复...