J. New Energy Vehicle

题目链接

  • 怎样实现自定义排序函数的堆呢?
  • 从 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;
}
posted @   D06  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
//雪花飘落效果
点击右上角即可分享
微信分享提示