【刷题】【差分约束】intervals

[ai, bi]区间内 和 点集Z至少有ci个共同元素,

如果用 Si 表示区间[0,i]区间内至少有多少个元素的话,那么Sbi - Sai >= ci,

但是有很多点依然没有相连接起来

0<=Si - Si-1<=1

 

1>差分约束

//条件转化:
//sum[j]-sum[i-1]>=c[i]
//sum[i-1] <= sum[j] -c[i]
//i-1 => j,c[i]

//且 0<= sum[i]-sum[i-1] <=1
//i => i-1,-1
//i-1 => i,0 

#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cstring>
using namespace std;
inline int read()
{
    int x=0;char c=getchar();
    while(c<'0' || c>'9') c=getchar();
    while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
    return x;
}
int n;
const int N=5e4+13,M=N*3;

int head[N],tot;
int v[M],w[M],nx[M];
void add(int u,int vv,int ww)
{ v[++tot]=vv,w[tot]=ww,nx[tot]=head[u],head[u]=tot; }

int st=N,ed;
int dis[N];
bool in[N];
void SPFA()
{
    memset(dis,128,sizeof(dis));
    queue <int> q;
    q.push(st),dis[st]=0;
     
    while(!q.empty() )
    {
        int t=q.front() ;q.pop() ;
        
        for(int i=head[t];i;i=nx[i])
        {
            int nx=v[i];
            if(dis[nx]<dis[t]+w[i])
            {
                dis[nx]=dis[t]+w[i];
                if(!in[nx]) 
                    in[nx]=true,q.push(nx); 
            }
        }
        in[t]=false;
    }
}

int main()
{
    n=read();
    int u,v,w;
    for(int i=1;i<=n;i++)
    {
        u=read(),v=read()+1,w=read();
        add(u,v,w);
        st=min(st,u);
        ed=max(ed,v);
    }
    for(int i=st;i<ed;i++)
        add(i+1,i,-1),add(i,i+1,0);
    
    SPFA();
    printf("%d\n",dis[ed]);
    
    return 0;
}

 

posted @ 2019-10-21 11:15  心若笺诗  阅读(129)  评论(0编辑  收藏  举报