题意:
解法:
首先发现nmq只有50.
如果不需要删除[l,r],
那么也是用堆做:
对物品按大小从小到大排序,
对盒子按容量从小到大排序,
遍历盒子,将大小<=当前盒子的物品的权值丢入堆中,
如果堆不为空,那么贪心的取出价值最大的放入当前盒子,
遍历完盒子之后就能得到答案了.
对于每组询问,如果要删除[l,r],
那么就在上面的做法中,遍历盒子的时候跳过被删除的盒子即可,
其他地方不需要改变.
code:
#include <bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=2e6+5;
PI e[maxm];
PI ee[maxm];
int n,m,q;
void solve(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
int x,y;cin>>x>>y;
e[i]={x,y};
}
for(int i=1;i<=m;i++){
int x;cin>>x;
ee[i]={x,i};
}
sort(e+1,e+1+n);
sort(ee+1,ee+1+m);
while(q--){
int l,r;cin>>l>>r;
priority_queue<int,vector<int>,less<int> >q;
int ans=0;
int j=1;
for(int i=1;i<=m;i++){
if(ee[i].second>=l&&ee[i].second<=r)continue;
while(j<=n&&e[j].first<=ee[i].first){
q.push(e[j].second);
j++;
}
if(q.size()){
ans+=q.top();q.pop();
}
}
cout<<ans<<endl;
}
}
signed main(){
ios::sync_with_stdio(0);
solve();
return 0;
}