3G 求调
  • 板块学术版
  • 楼主AlicX
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/19 19:04
  • 上次更新2024/3/19 20:43:42
查看原帖
3G 求调
706523
AlicX楼主2024/3/19 19:04

考虑用 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; 
} 
2024/3/19 19:04
加载中...