Subtask1、2全对,3有两个点wa,有一个点输出是:
109069
输入不知道。
#include<cstdio>
#include<queue>//for dijkstra - heap optimizing
#include<vector>//for graph
#include<utility>
#include<set>
#include<cstring>
using namespace std;
int n,s,t,m;
const int N=10005;
struct Node
{
int v,w;
friend bool operator <(const Node &x,const Node &y){return x.w>y.w;}
};
Node make_node(const int &v,const int &w)
{
Node ans;
ans.v=v;ans.w=w;
return ans;
}
int l[N],r[N],h[N],firstdrop[N<<1],dropto[N<<1],dis[N<<1];
bool vis[N<<1];
set<int> dropable;
vector<pair<int,int> > G[N<<1];
inline int LL(int x){return 2*x;}
inline int RR(int x){return 2*x+1;}
inline int min(const int &x,const int &y){return x<=y?x:y;}
void Dijkstra(int s)
{
memset(dis,0x7f,sizeof(dis));
priority_queue<Node> pq;
dis[s]=0;
pq.push(make_node(s,dis[s]));
while(!pq.empty())
{
Node cur=pq.top();
pq.pop();
int u=cur.v;
if(vis[u]) continue;
vis[u]=true;
vector<pair<int,int> >::iterator it=G[u].begin();
for(;it!=G[u].end();it++)
{
int v=it->first,w=it->second;
if(!vis[v]&&dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
pq.push(make_node(v,dis[v]));
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&s,&t);
m=2*n+1;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&l[i],&r[i],&h[i]);
G[LL(i)].push_back(make_pair(RR(i),r[i]-l[i]));
G[RR(i)].push_back(make_pair(LL(i),r[i]-l[i]));
}
//prework firstdrop&dropto:
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(h[i]>h[j])
{
//Right
if(r[i]>=l[j]&&r[i]<=r[j])
if(firstdrop[RR(i)]<=h[j])
{
firstdrop[RR(i)]=h[j];
dropto[RR(i)]=j;
}
if(l[i]>=l[j]&&l[i]<=r[j])
if(firstdrop[LL(i)]<=h[j])
{
firstdrop[LL(i)]=h[j];
dropto[LL(i)]=j;
}
}
for(int i=1;i<=m;i++)
if(dropto[i]==t) dropable.insert(i);
//make graph:
for(int i=2;i<=m;i+=2)
{
if(dropto[i+1]!=0)
{
int nowh=h[i/2]-h[dropto[i+1]],Llen=r[i/2]-l[dropto[i+1]],Rlen=r[dropto[i+1]]-r[i/2];
G[i+1].push_back(make_pair(LL(dropto[i+1]),nowh+Llen));
G[i+1].push_back(make_pair(RR(dropto[i+1]),nowh+Rlen));
}
if(dropto[i]!=0)
{
int nowh=h[i/2]-h[dropto[i]],Llen=l[i/2]-l[dropto[i]],Rlen=r[dropto[i]-l[i/2]];
G[i].push_back(make_pair(LL(dropto[i]),nowh+Llen));
G[i].push_back(make_pair(RR(dropto[i]),nowh+Rlen));
}
}
Dijkstra(2*s);
int minn=2147483647;
if(dropable.size()==0)
{
printf("-1\n");
return 0;
}
set<int>::iterator it=dropable.begin();
for(;it!=dropable.end();it++) minn=min(minn,dis[*it]+(h[*it/2]-h[t]));
if(minn>=0x7f7f7f7f)
{
printf("-1\n");
return 0;
}
printf("%d\n",minn);
return 0;
}