How E
  • 板块学术版
  • 楼主Ooj_bai
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/24 22:13
  • 上次更新2024/8/24 22:29:54
查看原帖
How E
1037830
Ooj_bai楼主2024/8/24 22:13

rt 以下是代码
record
思路是每次取出最小边并更新
询问复杂度哪里伪了|求条

#include<bits/stdc++.h>
#define int long long
#define maxn 200005
using namespace std;
int n,m;
int x[maxn];
int read(){
	int x=0;char ch;
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x;
}
void write(int x){
	char sta[25],top=0;
	do{
		sta[++top]=x%10+'0';
		x/=10;
	}while(x);
	for(int i=top;i>=1;i--)putchar(sta[i]);
}
struct train_type{
	int s,t,B,num;
	bool operator < (const train_type &other)const{
		return s>other.s;
	}
}First; 
bool cmp(train_type x,train_type y){
	return x.s<y.s;
}
int vis[maxn],inqueue[maxn];
vector<train_type>to[maxn];
signed main(){
	cin>>n>>m>>x[1];
	for(int i=1;i<=m;i++){
		int a,b,s,t;
		a=read();b=read();
		s=read();t=read();
		to[a].push_back({s,t,b,i});
		if(i==1)First={s,t,b,i};
	}
	priority_queue<train_type>pq;
	pq.push(First);
	for(int i=1;i<=n;i++)sort(to[i].begin(),to[i].end(),cmp);
	while(pq.size()){
		train_type now=pq.top();pq.pop();
		if(vis[now.num])continue;
		vis[now.num]=1;
		train_type xxx={now.t};
		int start=lower_bound(to[now.B].begin(),to[now.B].end(),xxx,cmp)-to[now.B].begin();
		for(int i=start;i<to[now.B].size();i++){
			train_type it=to[now.B][i];
			x[it.num]=max(x[it.num],x[now.num]+now.t-it.s);
			if(!inqueue[it.num])pq.push(it);
			inqueue[it.num]=1;
		}
	} 
	for(int i=2;i<=m;i++){
		write(x[i]);
		putchar(' ');
	}
	return 0;
}

2024/8/24 22:13
加载中...