『一本通』差分约束系统

Intervals

设$s[k]$表示$0$~$k$之间最少选出多少个整数。

由题得$s[b_i]-s[a_i-1]\ge c_i$,$0\le s[k+1]-s[k] \le 1$ 。

根据关系式连边,$SPFA$ 跑一遍 最长路 即可。

#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
int n,cnt,Min,Max,fro[N],dis[N];
bool vis[N];
struct edge{int to,w,nxt;}e[N<<2];
queue<int> q;
void add(int x,int y,int z) {
    e[++cnt].to=y,e[cnt].w=z,e[cnt].nxt=fro[x]; fro[x]=cnt;
}

int SPFA() {
    memset(dis,-0x3f,sizeof(dis));
    dis[Min]=0,vis[Min]=1;
    q.push(Min);
    while(!q.empty()) {
        int u=q.front();
        q.pop(),vis[u]=0;
        for(int i=fro[u];i;i=e[i].nxt) {
            int v=e[i].to;
            if(dis[v]<dis[u]+e[i].w) {
                dis[v]=dis[u]+e[i].w;
                if(!vis[v]) vis[v]=1,q.push(v);
            }
        }
    }
    return dis[Max];
}

int main() {
    scanf("%d",&n);
    int a,b,c;
    Min=N+1,Max=-1;
    for(int i=1;i<=n;i++) {
        scanf("%d%d%d",&a,&b,&c);
        add(a-1,b,c);
        Min=min(Min,a-1),Max=max(Max,b);
    }
    for(int i=Min;i<=Max;i++)
     add(i,i+1,0),add(i+1,i,-1);
    printf("%d",SPFA());
}

原文地址:https://www.cnblogs.com/qq8260573/p/10387599.html

时间: 2024-08-01 15:04:04

『一本通』差分约束系统的相关文章

『一本通』区间DP

石子合并 1 #include<bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 using namespace std; 4 int n,sm[505][505],bg[505][505],sum[505]; 5 inline int read() { 6 int x=0,f=1; char c=getchar(); 7 while(c<'0'||c>'9') {if(c=='-')f=-1; c=getchar();} 8 while(c>

『一本通』二分与三分

愤怒的牛 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,ans,a[100005]; 4 5 int check(int x) { 6 int cnt=1,lst=a[1]; 7 for(int i=2;i<=n;i++) 8 if(a[i]-lst>=x) cnt++,lst=a[i]; 9 return cnt; 10 } 11 12 int main() { 13 scanf("%d%d&quo

『一本通』广搜的优化技巧

Knight Moves 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int dx[9]={2,2,1,1,-1,-1,-2,-2},dy[9]={-1,1,-2,2,-2,2,-1,1}; 4 int n,L,step[305][305]; 5 struct node{int x,y;}b,e; 6 queue<node>q; 7 bool check(int x,int y) {return x>=0&

『一本通』哈希和哈希表

Oulipo 1 #include<bits/stdc++.h> 2 #define N 1000000+5 3 using namespace std; 4 typedef unsigned long long ULL; 5 const int b=55; 6 ULL n,m,s,ans,p[N],sum[N]; 7 char s1[N],s2[N]; 8 9 int main() { 10 scanf("%s",s1+1),scanf("%s",s2

『Python』内存分析_list和array的内存增长模式

『Python』内存分析_List对象内存占用分析 在Python中,列表是一个动态的指针数组,而array模块所提供的array对象则是保存相同类型的数值的动态数组.由于array直接保存值,因此它所使用的内存比列表少.列表和array都是动态数组,因此往其中添加新元素,而没有空间保存新的元素时,它们会自动重新分配内存块,并将原来的内存中的值复制到新的内存块中.为了减少重新分配内存的次数,通常每次重新分配时,大小都为原来的k倍.k值越大,则重新分配内存的次数越少,但浪费的空间越多.本节通过一系

『ENGLISH』

以A字母开头的词汇 英文 中文 abstract module 抽象模组 access 访问.存取 access control 存取控制 access control information 存取控制资讯 access mechanism 存取机制 access rights 存取权限 accessibility 无障碍性 accessibility information 无障碍网页资讯 accessibility problem 无障碍网页问题 accessible 无障碍的 access

『TensorFlow』函数查询列表_神经网络相关

神经网络(Neural Network) 激活函数(Activation Functions) 操作 描述 tf.nn.relu(features, name=None) 整流函数:max(features, 0) tf.nn.relu6(features, name=None) 以6为阈值的整流函数:min(max(features, 0), 6) tf.nn.elu(features, name=None) elu函数,exp(features) - 1 if < 0,否则featuresE

差分约束系统

差分约束系统是指一系列不等式: $$ X_j - X_i \le C_{ij}(1\le i, j \le n) $$ 当然 i,j 不必取遍 1-n,而且在扩展的状况下,对于每个(i,j),可以由多个 $C_{ij}$,但是我们很容易把它们化成一个不等式. 在求解不等式组之前,我们可以分析一下这个不等式组的性质. 1. 这个不等式组是可以无解的,比如: $$X_1 - X_2 \le -1 \\ X_2 - X_3 \le -1 \\ X_3 - X_1 \le -1$$ 否则三个不等式相加得

UVa 515 - King (差分约束系统 + SPFA求带负权最短路)

下面是差分约束系统的详细介绍,以及解决方法~ 摘抄自 xuezhongfenfei(他好像也是转的....) 差分约束系统 X1 - X2 <= 0 X1 - X5 <= -1 X2 - X5 <= 1 X3 - X1 <= 5 X4 - X1 <= 4 X4 - X3 <= -1 X5 - X3 <= -3 X5 - X4 <= -3 不等式组(1) 全都是两个未知数的差小于等于某个常数(大于等于也可以,因为左右乘以-1就可以化成小于等于).这样的不等式组