求调玄两关
查看原帖
求调玄两关
749811
Licis_Subway楼主2024/8/1 16:00

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;
}
2024/8/1 16:00
加载中...