玄关+求问如何解决此代码的TLE
  • 板块学术版
  • 楼主Autumn_Rain
  • 当前回复4
  • 已保存回复5
  • 发布时间2024/11/18 19:12
  • 上次更新2024/11/18 21:22:18
查看原帖
玄关+求问如何解决此代码的TLE
826079
Autumn_Rain楼主2024/11/18 19:12

https://codeforces.com/contest/2037/problem/D

#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
int n,m,L;
const int N=2e5+10;
vector<int>w[N];
int x;
int l[N],r[N];
int k,ed[N],num[N];
priority_queue<int>a;
void solve(){
	cin>>n>>m>>L;
	for(int i=1;i<=2e5;i++){
		w[i].clear();
		ed[i]=num[i]=0;
	}
	while(!a.empty())a.pop();
	int ans=0;
	for(int i=1;i<=n;i++){
		cin>>l[i]>>r[i];
	}
	for(int i=1;i<=n;i++){
		int j=i;
		while(j<n&&r[j]+1==l[j+1]){
			j++;
		}
		ed[l[i]]=r[j];
		i=j;
	}
	for(int i=1;i<=m;i++){
		int t;
		cin>>x>>t;
		w[x].push_back(t);
	}
	k=1;
	for(int i=1;i<=L;i++){
		if(w[i].size()){
			for(int j=0;j<w[i].size();j++){
				a.push(w[i][j]);
			}
			continue;
		}
		if(!ed[i]){
			continue;
		}
		int len=ed[i]-i+1;
		while(!a.empty()&&k<=len){
			int p=a.top();
			a.pop();
			k+=p;
			ans++;
		}
		if(k<=len){
			cout<<"-1\n";
			return;
		}
		if(ed[i]==L)break;
		i=ed[i];
	}
	cout<<ans<<"\n";
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>T;
	while(T--)solve();
	return 0;
}
2024/11/18 19:12
加载中...