题目链接
- 怎样实现自定义排序函数的堆呢?
- 从 C++11 开始,如果使用 lambda 函数自定义 Compare 则需要将其作为构造函数的参数代入,如:
priority_queue<int,vector<int>,decltype(cmp)>q(cmp);
- decltype 说明符可以推断表达式的类型
- 当然本题其实不需要自定义排序函数,因为在调用排序运算符时,决不能读取外部数值可能会改变的数组
点击查看代码
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)