【SPOJ116】Intervals
题目大意:有 N 个区间,在区间 [a, b] 中至少取任意互不相同的 c 个整数。求在满足 N 个区间约束的情况下,至少要取多少个正整数。
题解:差分约束系统模板题。
差分约束系统是对于 N 个变量的 M 组线性约束,每组约束满足的条件形如 \(X_i\le X_j+c\)。当所有约束条件均得到满足的时候,意味着以上 M 组不等式均成立。这时,类比于图论中的单源最短路模型,即:当对一个有向图求完单源最短路算法之后,对于图中每一个节点均满足 \(d[i]\le d[j]+e(i,j)\)。因此,可以将 \(X_i\) 看作有向图中的节点,权值看作边,求单源最短路的过程结束后,自然保证了所有约束条件的成立(无解的情况除外)。
差分约束系统最重要的是如何构造,构造方法大体有:
- 将最优解表示为前缀的形式,这样才能利用到区间的差分性质。
- 考虑最优解前缀的单调性,即:是否隐含着后一项必须大于前一项。
- 对于本题来说,还需要考虑每个位置的点只能被选择一次。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
struct node{
int nxt,to,w;
}e[maxn<<2];
int tot=1,head[maxn];
inline void add_edge(int from,int to,int w){
e[++tot]=(node){head[from],to,w},head[from]=tot;
}
int n,bl,br,d[maxn];
queue<int> q;
bool in[maxn];
void read_and_parse(){
n=read(),bl=1e8,br=-1e8;
for(int i=1;i<=n;i++){
int l=read()+1,r=read()+1,c=read();
bl=min(bl,l),br=max(br,r);
add_edge(l-1,r,c);
}
for(int i=bl;i<=br;i++)add_edge(i-1,i,0),add_edge(i,i-1,-1);
}
void spfa(){
fill(in+bl,in+br+1,0);
fill(d+bl,d+br+1,-1e9);
d[bl-1]=0,in[bl-1]=1,q.push(bl-1);
while(q.size()){
int u=q.front();q.pop(),in[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(d[v]<d[u]+w){
d[v]=d[u]+w;
if(!in[v])in[v]=1,q.push(v);
}
}
}
}
void solve(){
spfa();
printf("%d\n",d[br]);
}
void init(){
memset(head,0,sizeof(head)),tot=1;
}
int main(){
int T=read();
while(T--){
init();
read_and_parse();
solve();
}
return 0;
}
【SPOJ116】Intervals的更多相关文章
- 【POJ】【3680】Intervals
网络流/费用流 引用下题解: lyd: 首先把区间端点离散化,设原来的数值i离散化后的标号是c[i].这样离散化之后,整个数轴被分成了一段段小区间. 1.建立S和T,从S到离散化后的第一个点连容量K, ...
- 【poj1201】 Intervals
http://poj.org/problem?id=1201 (题目链接) 题意 给出n个区间${[ai,bi]}$,要求选出尽可能少的数,使得每个区间i中至少存在${c[i]}$个数. Soluti ...
- 【POJ1021】Intervals (最短路解差分约束)
题目: Sample Input 5 3 7 3 8 10 3 6 8 1 1 3 1 10 11 1 Sample Output 6 题意: 我们选数,每个数只能选一次.给定n个条件[ai,bi]和 ...
- 【XSY1841】Intervals
Description 在一个长度为m的序列中选出n个区间,这些区间互不包含,且至少有一个区间的左端点为x. 问有多少种方案,注意交换两个区间的顺序视为不同方案. 答案很大,输出模10000000 ...
- 【POJ3680】Intervals(费用流)
题意:有n条线段,每条有起点,终点和一个权值 要求选取一些线段,使它们的权值和最大,并且使每一个点被覆盖不超过k次 1 ≤ K ≤ N ≤ 200 1 ≤ ai < bi ≤ 100,000, ...
- 【题解】Intervals
题目大意 有\(n\)个区间(\(1 \leq n \leq 200\)),第\(i\)个区间覆盖\((a_{i}, b_{i})\)且有权值\(w_{i}\)(\(1 \leq a_{i} &l ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 【POJ 1201 Intervals】
Time Limit: 2000MSMeamory Limit: 65536K Total Submissions: 27949Accepted: 10764 Description You are ...
- 【POJ 1201】 Intervals(差分约束系统)
[POJ 1201] Intervals(差分约束系统) 11 1716的升级版 把原本固定的边权改为不固定. Intervals Time Limit: 2000MS Memory Limit: ...
随机推荐
- 移动APP用例设计中的关键点(转载)
http://www.51testing.com/html/52/n-4421752.html 在测试工作中我们需要不断的总结和储备自己的知识和经验,譬如具备特定属性.环境以及场景,如:PC,手机,智 ...
- adoquery.refresh和adoquery.query的区别
大的区别没有 1: requery是通过重新发出原始命令并再次检索数据,可使用 Requery 方法刷新来自数据源的 Recordset 对象的全部内容.调用该方法等于相继调用 Close 和 Ope ...
- How to remove ROM in MAME
/usr/share/games/mame/roms/ /usr/local/share/games/mame/roms/ sudo rm /usr/local/share/games/mame/ro ...
- Zero to Build: Create new Xamarin apps in minutes with AppMap
Creating a new Xamarin.Forms app can be an intimidating task, especially if you add in content pages ...
- 想要配置文件生效 需要通过添加到web.xml加载到内存中
想要配置文件生效 需要通过添加到web.xml加载到内存中
- linux用户、文件权限相关命令
root 现代操作系统一般属于多用户的操作系统,也就是说,同一台机器可以为多个用户建立账户,一般这些用户都是为普通用户,这些普通用户能同时登录这台计算机,计算机对这些用户分配一定的资源. 普通用户在所 ...
- Photoshop独立安装包下载页面
下载页面地址:https://helpx.adobe.com/cn/creative-cloud/kb/creative-cloud-apps-download.html
- python 模块之-time
python 模块time import time # 1 time() :返回当前时间的时间戳 time.time() #1473525444.037215 #------------------- ...
- mysql查询同一个字段下,不同内容的语句
太久没有用SQL语句都有些忘记了,今天工作中遇到了那就尝试记录一下吧 需求是这样的:想查询同一个字段下,两条指定了不同内容,的其他的值 主要是要想到用where......in 语句如下:select ...
- 【XSY2470】lcm 数学
题目大意 \(t\)组询问, 每组询问给定\(n\),求\(\sum_{k=1}^n[n,k]\),其中\([a,b]\)表示\(a\)和\(b\)的最小公倍数 . \(t\leq 300000,n\ ...