题意

给出数轴上的n个区间[ai,bi],每个区间都是连续的int区间。

现在要在数轴上任意取一堆元素,构成一个元素集合V

要求每个区间[ai,bi]和元素集合V的交集至少有ci不同的元素

求集合V最小的元素个数。

题解

一眼望去差分约束。所以开始找约束条件。

设sum[i]为[1,i]闭区间的元素个数。

sum[b[i]]-sum[a[i]-1]>=c[i];

还有个隐含(显然)的约束条件:sum[i]-sum[i-1]>=0

然后跑最短路即可。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=;
struct edge{
int to,w,nxt;
}e[maxn*];
int n,cnt,head[maxn],dis[maxn],book[maxn];
void add(int u,int v,int w){
cnt++;
e[cnt].to=v;
e[cnt].nxt=head[u];
e[cnt].w=w;
head[u]=cnt;
}
void spfa(){
queue<int> q;
for(int i=;i<=;i++){
dis[i]=-;
}
book[]=;
q.push();
while(!q.empty()){
int u=q.front();
q.pop();
book[u]=;
for(int i=head[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(book[v]==){
book[v]=;
q.push(v);
}
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
u+=;
v+=;
add(u-,v,w);
}
for(int i=;i<=;i++){
add(i-,i,);
add(i,i-,-);
}
spfa();
printf("%d",dis[]);
return ;
}

最新文章

  1. CSS Table Gallery
  2. java 模拟qq源码
  3. css+div
  4. ueditor-图片上传是报错
  5. html学习笔记1
  6. Windows Phone 8.1开发:如何从ListView中,获取ScrollViewer对象
  7. MySQL 线上配置文件
  8. 在QT程序中使用cout和cin
  9. 我对面向对象设计的理解——Java接口和Java抽象类
  10. mysql学习之check无效的解决及触发器的使用
  11. IDEA远程Debug
  12. 模拟获取post数据的方式
  13. SSH Secure Shell Client中文乱码的解决方法
  14. java——IObufferedReader文件输入输出流
  15. SpringBoot系列一:SpringBoot的产生
  16. Net系列框架-Dapper+简单三层架构
  17. node 加密音频文件 和 解密音频文件
  18. [二十七]SpringBoot 之 Restful接口的跨域请求
  19. 前端架构一之XAMPP
  20. 连接数据库的DBUtils工具类

热门文章

  1. vue中router-link的click事件失效的解决办法
  2. java基础——单例设计模式(懒汉式)
  3. P3809 【模版】后缀排序
  4. (转载)安卓6.0之前的系统 判断app是否有录音权限
  5. 1806最大数 string和sort函数用法
  6. js闭包的用途详解
  7. shell-3.bash的基本功能:通配符和其他特殊字符
  8. java的selenium环境搭建
  9. 微软的鼠标 Microsoft mouse
  10. EasyUI Combotree只选择叶子节点