[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 ",dis[ed]); return 0; }