差分约束求助
  • 板块学术版
  • 楼主rand_Zq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/31 14:58
  • 上次更新2024/8/31 18:35:32
查看原帖
差分约束求助
901086
rand_Zq楼主2024/8/31 14:58

ABC368E

建图后因为是拓扑跑了dij 但是有WA 换成spfa就不会有WA了 但是有T

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=4e5+5;
int n,m,a[N],b[N],s[N],t[N],vis[N],node,dis[N];
vector<int>suf[N],vec[N];
vector<pair<int,int>>g[N];
int my(int x,int y){
    return s[x]>s[y];
}
void dij(int s){
    priority_queue<pair<int,int>>q;
    q.push({0,s});
    while(!q.empty()){
        auto [w,u]=q.top();
        q.pop();
        if(!vis[u]){
            vis[u]=1,dis[u]=w;
            for(auto [v,ww]:g[u]){
                if(!vis[v]){
                    q.push({w+ww,v});
                }
            }
        }
    }
    for(int i=2;i<=n;i++){
        cout<<dis[i]<<" ";
    }
}
signed main(){
    cin>>n>>n>>dis[1];
    for(int i=1;i<=n;i++){
        cin>>a[i]>>b[i]>>s[i]>>t[i],vec[a[i]].push_back(i);
    }
    node=n;
    for(int i=1;i<N;i++){
        sort(vec[i].begin(),vec[i].end(),my);
        int flag=0;
        for(int j=0;j<vec[i].size();j++){
            node++,suf[i].push_back(node);
            if(!flag){
                g[node].push_back({vec[i][j],-s[vec[i][j]]});
            }
            else{
                g[node].push_back({node-1,0}),g[node].push_back({vec[i][j],-s[vec[i][j]]});
            }
            flag=1;
        }
    }
    for(int i=1;i<=n;i++){
        if(vec[b[i]].size()){
            int l=0,r=vec[b[i]].size()-1,ret=-1;
            while(l<=r){
                int mid=(l+r)>>1;
                if(t[i]<=s[vec[b[i]][mid]]){
                    ret=mid,l=mid+1;
                }
                else{
                    r=mid-1;
                }
            }
            if(ret==-1){
                continue;
            }
            g[i].push_back({suf[b[i]][ret],t[i]});
        }
    }
    for(int i=1;i<=node;i++){
        g[0].push_back({i,dis[i]});
    }
    dij(0);
}
2024/8/31 14:58
加载中...