J. New Energy Vehicle

D06發表於2024-10-28
  • 怎樣實現自定義排序函式的堆呢?
  • 從 C++11 開始,如果使用 lambda 函式自定義 Compare 則需要將其作為建構函式的引數代入,如:
    priority_queue<int,vector<int>,decltype(cmp)>q(cmp);
  • decltype 說明符可以推斷表示式的型別
  • 當然本題其實不需要自定義排序函式,因為在呼叫排序運算子時,決不能讀取外部數值可能會改變的陣列
點選檢視程式碼
#include <bits/stdc++.h>
using namespace std;
int a[100005],b[100005],x[100005],t[100005];
deque<int>q[100005];
priority_queue<pair<int,int> >cur;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int n,m;
		cin>>n>>m;
		long long sum=0;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			b[i]=a[i];
			sum+=a[i];
			q[i].clear();
		}
		for(int i=1;i<=m;i++)
		{
			cin>>x[i]>>t[i];
			q[t[i]].push_back(x[i]);
		}
		while(cur.size())
		{
			cur.pop();
		}
		for(int i=1;i<=n;i++)
		{
			q[i].push_back(INT_MAX);
			cur.push(make_pair(-q[i].front(),i));
		}
		for(int i=1;i<=m;i++)
		{
			int dis=x[i]-x[i-1];
			while(cur.size())
			{
				int n1=cur.top().second;
				if(-cur.top().first!=q[n1].front())
				{
					cur.pop();
					continue;
				}
				if(b[n1]>dis)
				{
					b[n1]-=dis;
					dis=0;
					break;
				}
				else if(b[n1]==dis)
				{
					b[n1]=0;
					dis=0;
					cur.pop();
					break;
				}
				else
				{
					dis-=b[n1];
					b[n1]=0;
					cur.pop();
				}
			}
			if(dis>0)
			{
				break;
			}
			sum=sum+a[t[i]]-b[t[i]];
			b[t[i]]=a[t[i]];
			q[t[i]].pop_front();
			cur.push(make_pair(-q[t[i]].front(),t[i]));
		}
		cout<<sum<<endl;
	}
	return 0;
}

相關文章