求助,贪心爆炸(悬关
查看原帖
求助,贪心爆炸(悬关
660883
Wallacewwz楼主2024/8/14 11:40
#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 7e5+10;
const int INF = 0x3f3f3f3f;
struct node{
	int f, t, coast;
	char op;
}fly[N];
bool cmp(node f1, node f2)
{
	if(f1.f==f2.f)
	{
		if(f1.t==f2.t)return f1.coast<f2.coast;
		else return f1.t<f2.t;
	}
	else return f1.f<f2.f;
}
struct tr{
	int to,step;
};
int change(char x)
{
	if(x == 'O')return 0;
	return 1;
}
unordered_map<int,int>flO[N],flR[N];
vector<tr>tra[N];
int get(int st, int ed, char op)//查询对应航班的票价 O(1) 
{
	if(op == 'O')
	{
		if(flO[st][ed]==0)return INF;
		return flO[st][ed];
	}
	else
	{
		if(flR[st][ed]==0)return INF; 
		return flR[st][ed];
	}
} 
int a[N],n,city,m,lst=-1,lst2=-1,mark[N][2],walk[N],ans;
char lstop;
bool check(int st, int ed, int now)//查询在第now个点之后是否需要从st到ed的行程,用于得知是否能返程(即买双程票,此处爆炸!!!!!!!!!! 
{
	int pos = -1, ste = INF;
	for(int i = 0; i < tra[st].size(); i++)
	{
		if(tra[st][i].step==INF)continue;
		if(tra[st][i].to==ed)
		{
			if(tra[st][i].step<ste)
			{
				ste = tra[st][i].step;
				pos = i;
				break;
			}
		}
	}
	if(pos!=-1)tra[st][pos].step = 0x3f3f3f3f;
	if(ste!=INF)walk[ste] = 1;
	if(pos == -1)return 0;
	else return 1;
}
void prework()//预处理所有航班信息 nlogn
{
	for(int i = 1; i < n; i++)tra[a[i]].push_back((tr){a[i+1],i});
	sort(fly+1,fly+m+1,cmp);
	for(int i = 1; i <= m; i++)
	{
		if(fly[i].f==INF)break;
		if(fly[i].f==lst&&fly[i].t==lst2&&fly[i].op==lstop)fly[i].f=INF;
		else lst = fly[i].f, lst2 = fly[i].t, lstop = fly[i].op; 
	}
	sort(fly+1,fly+m+1,cmp);
	for(int i = 1; i <= m; i++)
	{
		if(fly[i].f==INF)break; 
		if(fly[i].op=='O')
		{
			flO[fly[i].f][fly[i].t] = fly[i].coast; 
		}
		else
		{
			flR[fly[i].f][fly[i].t] = fly[i].coast;
		}
	}
	
}
void travel()//走 
{
	int st,ed;
	for(int i = 1; i < n; i++)
	{
		st = a[i],ed = a[i+1];
		if(walk[i])
		{
			continue;
		}
		walk[i] = 1; 
		if(check(ed,st,i)) 
		{
			ans += min(get(st,ed,'R'),get(st,ed,'O')+min(get(ed,st,'O'),get(ed,st,'R')));//如果后面要回,则可以考虑这些方法 
		}
		else
		{
			ans += min(get(st,ed,'O'),get(st,ed,'R'));//不回的情况 
		}
	}
}
signed main()
{
	cin >> city >> n;
	for(int i = 1; i <= n; i++)cin >> a[i];
	cin >> m;
	for(int i = 1; i <= m; i++)
	{
		cin >> fly[i].f >> fly[i].t >> fly[i].op >> fly[i].coast;
		if(fly[i].f>city||fly[i].t>city)fly[i].f=fly[i].t=INF;//城市不存在特判 
	}
	prework();
	travel();
	cout << ans << '\n';
	return 0;
}

check的时候出现了问题,导致TLE

当然还会WA

拜托各位大佬帮忙看看哪里出问题了

2024/8/14 11:40
加载中...