POJ1201:Intervals【差分约束】

题目大意:给出N个闭区间,每个区间给出一个ci值,让你找出最小的数集Z使得每个闭区间都有不少于ci个Z中的元素,求card(Z)

思路:06年集训队论文《浅析差分约束系统》有详细的解题,设Sn为[0,n]中Z中元素的个数,ai ,bi为区间的两个端点,则可列出以下不等式:

0<=Sn-S(n-1)<=1

S(bi+1)-S(ai)>=ci

然后就可以用差分约束做了,顺便提一下,如果要把0<=Sn-S(n-1)<=1这些边加进图中的话边集会非常的大,以至于一开始邻接表开50000时TLE  130000 RE 140000 WA 一直开到150000才AC

#include<cstdio>
#include<algorithm>
#include<queue>
#include<string.h>
#include<iostream>
#define maxn 150010
using namespace std;
int head[maxn],point[maxn],next[maxn],value[maxn],dist[maxn];
int now=0,minx=19941117,maxx=-19941117;
queue<int> q;
void add(int x,int y,int c)
{
    next[++now]=head[x];
    head[x]=now;
    point[now]=y;
    value[now]=c;
}
void spfa(int s)
{
    int u;
    bool visit[maxn]={0};
    for(int i=minx;i<=maxx;i++)dist[i]=-19941117;
    q.push(s);
    visit[s]=1;
    dist[s]=0;
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        visit[u]=0;
        for(int i=head[u];i!=0;i=next[i])
        {
            int k=point[i];
            if (dist[u]+value[i]>dist[k])
            {
                dist[k]=dist[u]+value[i];
                if (visit[k]==0)
                {
                    visit[k]=1;
                    q.push(k);
                }
            }
        }
    }
}
int main()
{
    int n,a,b,c;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        if (b+1>maxx)maxx=b+1;
        if (a<minx)minx=a;
        add(a,b+1,c);
    }
    for(int i=minx;i<=maxx;i++)
    {
        add(i,i+1,0);
        add(i+1,i,-1);
    }
    spfa(minx);
    printf("%d\n",dist[maxx]);
    return 0;
}
时间: 2024-10-13 10:52:24

POJ1201:Intervals【差分约束】的相关文章

poj1201 Intervals——差分约束

题目:http://poj.org/problem?id=1201 差分约束裸题: 设 s[i] 表示到 i 选了数的个数前缀和: 根据题意,可以建立以下三个限制关系: s[bi] >= s[ai-1] + ci ( 1 <= i <= n) s[i] >= s[i-1] + 0 ( 1 <= i <= mx) s[i-1] >= s[i] + (-1) (1 <= i <= mx) 然后求最长路,可以发现其中的 dis 值不会多余增大,也就满足题意要

「POJ1201」Intervals - 差分约束

->戳我进原题 *** Intervals Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 30393 Accepted: 11768 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, the

【POJ1716】Integer Intervals——差分约束||贪心

题目大意:给出n个区间,现在要你找出一个点集,使得这n个区间都至少有2个元素在这个点集里面,问这个点集最少有几个点. 解法一:差分约束系统 分析:其实这道题应该说是POJ1201的简化版,不过要注意的一点是,如果你用的是SPFA,那么你的差分约束系统应该为: s[b+1]-s[a]>=2; s[b+1]-s[b]>=0; s[b]-s[b+1]>=1. 为什么下标要全部加上1呢?因为这里的a和b有可能为0,如果按照原来s[a-1]的写法会出现是s[-1]这类数组越界的问题. 代码: #i

POJ 1201 Intervals 差分约束

http://poj.org/problem?id=1201 TLE了很久,因为用了cin..... 思路和其他差分约束差不多,http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html 如果区间[a, b]中至少有c个元素,如果用上面的博客,那么说明xa - xb >= c,但是注意这里是闭区间,xa - xb是不包括b这个点的, 就比如用了[a, b]有c个元素,[b, d]有x个,那么ans = c + x - 1个,

poj1201/zoj1508/hdu1384 Intervals(差分约束)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Intervals Time Limit: 10 Seconds      Memory Limit: 32768 KB You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: > reads the number of interva

POJ 2101 Intervals 差分约束

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27746   Accepted: 10687 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, their end points and

hdu 1384 Intervals (差分约束)

/* 给你 n 个区间 [Ai, Bi],要求从每一个区间中至少选出 Ci 个数出来组成一个序列 问:满足上面条件的序列的最短长度是多少? 则对于 不等式 f(b)-f(a)>=c,建立 一条 b 到 a 的边 权值为 c,则求的最长路 即为 最小值(集合) 而且有隐含条件:0<=f(a)-f(a-1)<=1 则有边权关系(a,a-1,0)以及(a-1,a,-1); */ /* 一般地,差分约束系统分两类:求最大差和最小差 1.求最大差 建立形如 A-B<=C 的不等式.在原图中加

POJ1201 Intervals[差分约束系统]

Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26028   Accepted: 9952 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, their end po

POJ 1716 Interger Intervals 差分约束(入门题)

题意:给出n个区间[a,b] n,a,b<=1e4,要求找到一个最小集合 使得每个区间至少有两个数在集合中.设d[i]为0~i中有多少个元素在集合中,mn,mx分别为左右端点 则对每个i=1..n都要满足 d[b[i]]-d[a[i]-1]>=2 保证等式有意义,d[i+1]<=d[i]+1 , d[i]<=d[i+1]全部化为小于号 d[a[i]-1]-d[b[i]]<=-2 若答案为ans 则d[mx]-d[mn-1]>=ans 把mx当作源点,求出到mn-1的最短

POJ1201 Intervals 【差分约束】

题目链接 POJ1201 题解 差分约束 令\(a[i]\)表示是否选择\(i\),\(s[i]\)表示\(a[i]\)的前缀和 对\(s[i] \quad i \in [-1,50000]\)分别建立一个点 首先有 \[s[i] - s[i - 1] \ge 0\] \[s[i] - s[i - 1] \le 1\] 然后就是限制条件 \[s[b] - s[a - 1] \ge c\] 然后就没了 用\(spfa\)跑最长路 由于题目保证有解,所以不会存在正环 复杂度上界是\(O(nm)\)的