题目链接:点击查看

题目大意:给定n个闭区间[ai,bi]和n个整数ci,你需要构造一个整数集合Z,使得Z中满足所有的ai<=x<=bi的整数不少于ci个,求出这样的整数集合Z最少包含多少个数

题目分析:因为这个题目的数最多只有5e4个,我们可以设一个函数S[k],表示0~k中最少选出多少个整数才能满足题意,则我们可以写出约束方程:

  1. S[bi]-S[ai-1]>=ci,满足题目条件
  2. 1>=S[k]-S[k-1]>=0,因为根据设计函数的本身性质,每个数k只有选或不选两种状态,故相邻两个函数之间的差非0即1

进行化简一下就能进一步得到差分约束方程了:

  1. S[k]>=S[k-1]+0
  2. S[k-1]>=S[k]+(-1)
  3. S[bi]>=S[ai-1]+ci

根据上面的方程建边然后跑最长路的spfa就能得到答案了,设mmin为最小的a-1,mmax为最大的b,则答案就是以mmin为起点的单源最长路跑完后的d[mmax]了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=5e4+100;//顶点数 const int M=2e5+100;//边数 struct Edge
{int to,w,next;
}edge[M];int head[N],d[N],cnt;//链式前向星 bool vis[N];void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;
}void spfa(int st)
{memset(vis,false,sizeof(vis));memset(d,0xcf,sizeof(d));d[st]=0;vis[st]=true;queue<int>q;q.push(st);while(q.size()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v]<d[u]+w){d[v]=d[u]+w;if(!vis[v]){q.push(v);vis[v]=true;}}}}
}void init()
{memset(head,-1,sizeof(head));cnt=0;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n;while(scanf("%d",&n)!=EOF){init();int mmax=0,mmin=inf;for(int i=1;i<=n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);a++,b++;mmax=max(mmax,b);mmin=min(mmin,a-1);addedge(a-1,b,c);}for(int i=mmin;i<mmax;i++){addedge(i,i+1,0);addedge(i+1,i,-1);}spfa(mmin);printf("%d\n",d[mmax]);}return 0;
}

POJ - 1201 Intervals(差分约束+最短路)相关推荐

  1. poj 1201 Intervals 差分约束

    真 .读题杀,英文题一脸懵逼,看来以后还要多读读英文题,不过读完了就能发现这其实是一道很裸的差分约束,按照题意建边即可,但还要注意的就是后一个要大于等于前一个,并且每个位置不能超过一个元素.求一边最大 ...

  2. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  3. AcWing 4247. 糖果(差分约束最短路)

    题目连接 https://www.acwing.com/problem/content/4250/ http://poj.org/problem?id=3159 思路 假设第i个同学得到的糖果数量为a ...

  4. [CCO 2019] Sirtet(差分约束+最短路)

    [CCO 2019] Sirtet description solution code description 题目链接 solution 很巧妙地将差分约束隐藏起来 问题的关键在于求出每一个sand ...

  5. [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]

    题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...

  6. POJ 3159 Candies 差分约束dij

    分析:设每个人的糖果数量是a[i] 最终就是求a[n]-a[1]的最大值 然后给出m个关系 u,v,c 表示a[u]+c>=a[v] 就是a[v]-a[u]<=c 所以对于这种情况,按照u ...

  7. I - 动物狂想曲 (HDU-6252)(差分约束-最短路模型+判负环)

    雷格西桑和路易桑是好朋友,在同一家公司工作.他们总是一起乘地铁去上班.他们的路线上有N个地铁站,编号从1到N.1站是他们的家,N站是公司. 有一天,雷格西桑起床晚了.当他来到车站时,路易桑已经离开X分 ...

  8. POJ 1201 Intervals (差分约束)

    POJ1716的变形,数据规模增大,用了循环数组. //9063355 NKHelloWorld 1201 Accepted 30788K 469MS C++ 1825B 2011-08-02 19: ...

  9. POJ 1716 Integer Intervals 差分约束

    题目:http://poj.org/problem?id=1716 1 #include <stdio.h> 2 #include <string.h> 3 #include ...

最新文章

  1. Caught exception java.lang.interruptedException(在集群上进行多个文件合并压缩时出错)
  2. JPA 注解的CascadeType属性
  3. python之常见报错整理
  4. c语言e怎么表示_来测测!这11个C语言入门基础知识你都掌握了吗?
  5. hrbust 1041(并查集)
  6. 随笔:《向死而生》---我修的死亡学分
  7. 【语音识别】基于matlab GUI DTW MFCC 0-9数字语音识别(带面板)【含Matlab源码 385期】
  8. 读取excel数据,根据word模板生成word文件。【python】【word vba】两种方法
  9. 网络安全工程师面试题合集(不全,暂不整理了)
  10. java在线ide_程序猿专用十大在线编译器(IDE)整理
  11. 网易云课堂资源合集百度云分享 下载
  12. dataframe按照拼音排序
  13. DAS、SAN和NAS三种存储方式
  14. 不定高度的slideUp动画效果
  15. html中怎么写艺术字,用CSS设计艺术字
  16. Unity中摄像机跟随
  17. HTML中视频默认显示自定义图片
  18. 【学习笔记 — Flink 处理迟到数据(★)】
  19. 这首王维的古诗该如何解析?
  20. Tuxera for Mac2022读写硬盘U盘工具

热门文章

  1. @requestparam map 接收前端的值_前端面试总结篇(初级)
  2. Nginx反向代理之proxy_set_header指令
  3. 服务降级-降级的概念
  4. synchronized的应用
  5. MultipartResolver
  6. EasyExcel实现读操作
  7. SpringBoot2.x整合redis实战讲解
  8. 算术运算符_四则与取模运算
  9. MapReduce案例-wordcount-Reduce阶段代码
  10. java无忧网_零基础java入门课程 - 学途无忧网 - 做技术的王者 - Powered By EduSoho