ABC368E求助
  • 板块学术版
  • 楼主rand_Zq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/25 17:40
  • 上次更新2024/8/25 20:38:24
查看原帖
ABC368E求助
901086
rand_Zq楼主2024/8/25 17:40

思路是差分约束+前缀优化建图 跑最长路 虽然权有正有负 但是是拓扑图 可以直接跑

#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 dfs(int u){
    if(vis[u]){
        return;
    }
    vis[u]=1;
    for(auto [v,w]:g[u]){
        dis[v]=max(dis[v],dis[u]+w),dfs(v);
    }
}
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]});
    }
    for(int i=1;i<=n;i++){
        dis[i]=-1e18;
    }
    dfs(0);
    for(int i=2;i<=n;i++){
        cout<<dis[i]<<' ';
    }
}
2024/8/25 17:40
加载中...