#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
拜托各位大佬帮忙看看哪里出问题了