70分代码求助
查看原帖
70分代码求助
1229738
CyansQwQ楼主2024/6/5 00:41
#include<bits/stdc++.h>
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>PII;
int Max=0,Min=0x3f3f3f3f;
const int N=2e5+10;
int w[N],v[N],x[N],y[N];//重量,价值,左端点,右端点

void solve()
{
	int n,m;
	ll s;
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>v[i];
		Max=max(Max,w[i]),Min=min(Min,w[i]);
	}
	for(int i=1;i<=m;i++)cin>>x[i]>>y[i];
	int l=Min-1,r=Max+1;
	map<int,ll>ans;//记录mid对应的答案
	auto check=[&](auto check,int mid)
	{
		vector<ll>snum(n+1),sv(n+1);//数量和,价值和
		for(int i=1;i<=n;i++)
		{
			if(w[i]>=mid)snum[i]=snum[i-1]+1,sv[i]=sv[i-1]+v[i];
			else snum[i]=snum[i-1],sv[i]=sv[i-1];//表示前i个符合要求的总量和
		}
		ll res=0;
		for(int i=1;i<=m;i++)
			res+=(snum[y[i]]-snum[x[i]-1])*(sv[y[i]]-sv[x[i]-1]);
		ans[mid]=res;
		if(res>s)return true;
		else return false;
	};
	while(l+1<r)
	{
		int mid=l+r>>1;
		if(check(check,mid)) l=mid;
		else r=mid;
	}
	cout<<abs(ans[l]-s);
	//维护答案和数组
}

int main()
{
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	solve();cout<<'\n';
	return 0;
}
2024/6/5 00:41
加载中...