考虑用 set 维护排队的人。
排序时假如两人都没喝粥,就按下标排,否则就按优先级排,假如优先级一样就按时间戳排序(入 set 时打上一个时间戳)。
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define il inline
using namespace std;
typedef pair<int,int> pii;
const int N=3e5+10;
int n,d;
bool mp[N];
int k[N],s[N];
struct Node{
int k,id,tim,sp;
il bool operator<(const Node& Zj)const{
if(sp==Zj.sp&&!sp) return id<Zj.id;
if(k!=Zj.k) return k>Zj.k;
return tim<Zj.tim;
}
}; vector<int> del[N];
il bool cmp(int a,int b){ return s[a]<s[b]; }
il void solve(){
cin>>n>>d; int cnt=n; int idx=0;
for(int i=1;i<=d;i++) del[i].clear(); set<Node> st;
for(int i=1;i<=n;i++) cin>>k[i]>>s[i],st.insert({k[i],i,++idx,0}),mp[i]=false;
for(int i=1;i<=d;i++){
if(!st.empty()){
auto it=st.begin();
int k=it->k,id=it->id;
st.erase(it);
if(!mp[id]) mp[id]=true,cnt--;
if(cnt==0){
cout<<i<<endl;
return ;
} if(i+s[id]<=d) del[i+s[id]].push_back(id);
} sort(del[i].begin(),del[i].end(),cmp);
for(int j=0;j<del[i].size();j++) st.insert({k[del[i][j]],del[i][j],++idx,1});
} puts("-1");
}
signed main(){
int T; cin>>T;
while(T--) solve();
return 0;
}