蒟蒻求助 为什么会CE?
查看原帖
蒟蒻求助 为什么会CE?
213196
Wens楼主2020/11/23 16:41
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
#include <queue>
#define ll long long
#define N 50017
#define BIG 100020060509
using namespace std;

ll Min(ll a,ll b){return a<b?a:b;}
ll Max(ll a,ll b){return a>b?a:b;}

ll read(){
	ll x=0,w=0;char ch=0;
	while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return w?-x:x;
}

ll n,m,k;
ll next[(N<<1)+N],to[(N<<1)+N],head[N],w[(N<<1)+1],cnt=1;
ll dis[N];
bool vis[N];
ll minn,maxx;

void add(ll x,ll y,ll z){
	next[++cnt]=head[x];
	to[cnt]=y;
	w[cnt]=z;
	head[x]=cnt;
}

void spfa(ll x){
	queue<ll> q;
	ll top=0;
	for(int i=minn;i<=maxx;++i)dis[i]=-BIG;
	dis[x]=0;
	memset(vis,false,sizeof(vis));
	q.push(x);
	vis[x]=true;
	while(!q.empty()){
		ll p=q.front();
		q.pop();
		vis[p]=false;
		for(int i=head[p];i;i=next[i]){
			ll tt=to[i];
			if(dis[tt]<dis[p]+w[i]){
				dis[tt]=dis[p]+w[i];
				if(!vis[tt]){
					vis[tt]=true;
					q.push(tt);
				}
			}
		}
	}
	cout<<dis[maxx]<<endl;
	return ;
}

int main(){
	ll T=read();
	while(T--){
		n=read();
		minn=BIG;
		maxx=-1;
		for(int i=1;i<=n;++i){
			ll x=read(),y=read(),z=read();
			add(x-1,y,z);
			maxx=Max(maxx,y);
			minn=Min(minn,x-1);
		}
		for(int i=minn;i<=maxx;++i){
			add(i,i+1,0);
			add(i+1,i,-1);
		}
		spfa(minn);
	}
	return 0;
}
2020/11/23 16:41
加载中...